2011-01-06 25 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 がkeyadd BEGIN EXECUTE(: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

+0

この現象を再現する小さなテストケースを教えてください。 –

+0

ストアドプロシージャとコールも表示してください。 –

答えて

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-01401ではなく、ORA-00001: Unique Constraint...というエラーが表示されます。したがって、それ以上の情報なしでは、それは不可能です。

1

私は手順が書き込まれた言語を知りませんしかし、この部分:

 EXCEPTION 
     ROLLBACK; 
    COMMIT; 
     RETURN; 

私の眉を上げます。 2つの質問:

  • これは何を行う予定ですか?

  • これらの行を削除すると問題は解決しますか?

+0

これらの2つの行に何が間違っていますか?なぜそれらを削除する必要があるのですか –

+0

まず、EXCEPTIONキーワードの後ろにWHEN句が必要です。第2に、ロールバック直後にコミットすることは目的がありません。これはあなたのエラーに直接関係しているのではないかと思いますが、あなたが示したコードは実際のコードではありません。 –

+1

中括弧もちょっと奇妙に見えます。 –

0

もう一度試してみると、大きすぎる他の列のいずれかの値を入力しています。このエラーは、主キー違反に取って代わるように見えます。

+0

すべての値が同じで、最後のcolumn.For最初はその59FC9AD0FA5A8932836824B0489B73252C120301A2205154C096B4EB213FA983D5E500B62A469439と第二のためにその905BD61AAEC986ACF887DBA7C04D650B61A8818ABEBE1720D810B4​​A426EB9220558B530D5119315Fを呼び出す期待しています。私は長さの違いを見ることができません。 :( –