2011-01-06 74 views
0

我在Oracle 9i中有一个存储过程,它在表中插入记录。该表具有构建的主键,以确保重复行不存在。ORACLE -1401错误

我试图通过调用此存储过程中插入一条记录,它正确地工作第一次。我再次尝试插入重复的记录,并期待唯一的约束违规错误。但我正在逐渐 ORA-01401插入值太大,

我知道它的意思,但我的查询,如果插入的值是真正的大它,然后如何得到成功的第一次尝试。

表是

CREATE TABLE KEY 
(
    ID VARCHAR2(25 BYTE), 
    KEY   NUMBER(4)      NOT NULL, 
    INSERT_DATE DATE, 
    WORK_KEY VARCHAR2(128 BYTE) 
) 

CREATE UNIQUE INDEX SACHINIDX ON KEY 
(ID, KEY) 

呼叫是 EXEC SQL EXECUTE BEGIN keyadd(:ID,:键,:WKEY); END; END-EXEC;

存储过程

PROCEDURE keyadd(id IN VARCHAR2, key IN NUMBER, wkey IN VARCHAR2) 
{ 
     BEGIN 
     INSERT INTO KEY 
      ( ID, 
       KEY, 
       INSERT_DATE, 
       WORK_KEY) 
      VALUES 
      (
       id, 
       key, 
       SYSDATE, 
       wkey 
      ); 
     EXCEPTION 
      ROLLBACK; 
     COMMIT; 
      RETURN; 
     END; 
} 

首先插入的sqlca.sqlcode是[0] 二次插入的sqlca.sqlcode是[-1401]

+0

桌子上是否有触发器可能会混淆这些值? – kurosch 2011-01-06 15:50:52

+0

你能告诉我们一个能够再现这种行为的小测试用例吗? – 2011-01-06 15:58:29

+0

请同时显示存储过程和调用。 – 2011-01-06 16:07:59

回答

1
CREATE TABLE KEY 
(
    ID VARCHAR2(25 BYTE), 
    KEY   NUMBER(4)      NOT NULL, 
    INSERT_DATE DATE, 
    WORK_KEY VARCHAR2(128 BYTE) 
); 

CREATE UNIQUE INDEX SACHINIDX ON KEY 
(ID, KEY); 


create or replace PROCEDURE keyadd(id IN VARCHAR2, key IN NUMBER, wkey IN VARCHAR2) 
is 
     BEGIN 
     INSERT INTO KEY 
      ( ID, 
       KEY, 
       INSERT_DATE, 
       WORK_KEY) 
      VALUES 
      (
       id, 
       key, 
       SYSDATE, 
       wkey 
      ); 

     COMMIT; 

--  EXCEPTION when others then 
--   ROLLBACK; 
end keyadd; 
/

begin 
    keyadd('one', 1, '59FC9AD0FA5A8932836824B0489B73252C120301A2205154C096B4EB213FA983D5E500B62A469439'); 
    keyadd('one', 1, '905BD61AAEC986ACF887DBA7C04D650B61A8818ABEBE1720D810B4A426EB9220558B530D5119315F'); 
end; 
/

给我预期的ORA-00001: Unique Constraint...错误,而不是ORA-01401。所以,没有进一步的信息就无法提供帮助。

1

我不知道这个程序编写语言,但这部分:

 EXCEPTION 
     ROLLBACK; 
    COMMIT; 
     RETURN; 

引起了我的眉毛。两个问题:

  • 这是应该做什么?

  • 是当你删除这些线您的问题解决了吗?

0

我最好的猜测是你的第二次尝试,你提供了一个太大的其他列之一的值。看起来这个错误将取代主键违规。