Sql 在oracle表的PK列中追加(-)减号
我有一个Biztalk应用程序,它正在接收xml文件,并使用WCF-CUSTOM适配器将数据简单地插入到一个oracle表中。我的问题是有时它会在主键列中插入负数。对于主键插入,我使用序列 我还手动检查了序列,它不会生成负数,因为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
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文件中,我们只有这四列的值,因此第一列的值始终为空。所以从应用程序中获取负值是没有意义的。