Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在oracle表的PK列中追加(-)减号_Sql_Oracle_Triggers_Sequence_Biztalk - Fatal编程技术网

Sql 在oracle表的PK列中追加(-)减号

Sql 在oracle表的PK列中追加(-)减号,sql,oracle,triggers,sequence,biztalk,Sql,Oracle,Triggers,Sequence,Biztalk,我有一个Biztalk应用程序,它正在接收xml文件,并使用WCF-CUSTOM适配器将数据简单地插入到一个oracle表中。我的问题是有时它会在主键列中插入负数。对于主键插入,我使用序列 我还手动检查了序列,它不会生成负数,因为NEXTVAL 以下是我的顺序: CREATE SEQUENCE "TEST"."SEQ_TESTBNUMBER_TMP" MINVALUE 1 MAXVALUE 999999999999999999 INCREMENT BY 1 START WITH 187

我有一个Biztalk应用程序,它正在接收xml文件,并使用WCF-CUSTOM适配器将数据简单地插入到一个oracle表中。我的问题是有时它会在主键列中插入负数。对于主键插入,我使用序列

我还手动检查了序列,它不会生成负数,因为
NEXTVAL

以下是我的顺序:

CREATE SEQUENCE  "TEST"."SEQ_TESTBNUMBER_TMP"  
MINVALUE 1 MAXVALUE 999999999999999999 
INCREMENT BY 1 START WITH 187 
NOCACHE  NOORDER  NOCYCLE ;
这意味着我在主键列中得到的值如下

197
-196
195
194
193
192
191
190
189
188
-187
-185
-186
-184
183
182
181
-169
-168
167
166
165
164
它显示为负值,但实际上不是。它是按顺序插入的,但在某些情况下,它只是在其前面附加(-)减号。我不知道为什么

触发代码

TRIGGER "TEST"."TR_TESTBNUMBER_TMP" 
    before INSERT ON "TEST"."NUMBER_RL" 
    FOR EACH row 
BEGIN 
    IF inserting THEN 
        IF :NEW."PKID" IS NULL THEN
            SELECT SEQ_TESTBNUMBER_TMP.nextval 
            INTO :NEW."PKID" 
            FROM dual;
        END IF;
    END IF;
END;
如果:NEW.“PKID”为空,则

上述条件不足以处理序列值的正确插入。您的应用程序正在为
PKID
插入负值,而不是空值。因此,以下条件将失败:

IF :NEW."PKID" IS NULL THEN
只要
PKID
有负值,上述条件就会失败,并将负值直接插入表中。您还需要在IF条件下处理负值

将其修改为:

IF :NEW."PKID" IS NULL OR :NEW."PKID" < 0 THEN
如果:NEW.“PKID”为NULL或:NEW.“PKID”<0,则

是否涉及触发器?张贴触发代码。
显示为负值,但实际上不是。
什么?签出
从pk=-168的表中选择*以确保这不是显示问题。有人插入/更新这些负值。是的,涉及Lalit触发器,下面是触发器代码触发器“TEST”。“TEST”中插入之前的“TR_TESTBNUMBER_TMP”。“NUMBER_RL”对于每行,如果插入,则开始,如果:NEW.“PKID”为空,然后从dual中选择SEQ_TESTBNUMBER_TMP.nextval to:NEW.“PKID”;如果结束;如果结束;结束;不要在注释中添加代码,请将其添加到您的问题中。现在我已经为你做到了。不管怎样,负值的原因在我看来很简单。请参阅答案。如果在insert语句中手动提供值,则该值将存储在表中:
insert into number_rl(pkid)值(-1)你的触发器不会阻止这一点。顺便说一句:您不需要选择
来获得序列值:
:new.pkid:=SEQ\u TESTBNUMBER\u TMP.nextval很好用。是的,我明白你的意思。但是,正如您看到的序列代码一样,它不应该生成负值。在某些情况下,只有它在生成。@AnshuKumar“它不应该生成负值。在某些情况下,只有它在生成”为什么不?这就是我向你解释的。应用程序正在插入负值,但触发器只能处理空值。每当插入负值时,就根本不使用序列,因为触发器中的IF条件不检查负值。因此直接插入负值。感谢您的回复。“您的应用程序正在插入负值”您能告诉我这些-ve值的来源吗?当我按顺序运行查询时,计数器正确地增加正值。你可以看到计数器按顺序递增,中间有几个-ve值。“你能告诉我这些-ve值的来源在哪里吗?”我怎么能告诉你的来源呢?只有你知道。不是吗?这是你的系统,你正在努力。源是使用此表的应用程序。你有没有尝试过修复和验证?我的表中有5列。对于第一列(我们有时会得到-ve值),即PK,我使用上述序列插入值,对于其余4列,我们使用BizTalk从xml文件中插入值,在该xml文件中,我们只有这四列的值,因此第一列的值始终为空。所以从应用程序中获取负值是没有意义的。