2011-01-06 54 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

我最好的猜測是你的第二次嘗試,你提供了一個太大的其他列之一的值。看起來這個錯誤將取代主鍵違規。