web-dev-qa-db-ja.com

OracleエラーORA-06512

なぜそれがORA-06512エラーを出すのかわからない

PROCEDURE PX(pNum INT,pIdM INT,pCv VARCHAR2,pSup FLOAT)
AS
    vSOME_EX EXCEPTION;

BEGIN 
    IF ((pNum < 12) OR (pNum > 14)) THEN     
        RAISE vSOME_EX;
    ELSE  
        EXECUTE IMMEDIATE  'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('||pCv||', '||pSup||', '||pIdM||')';
    END IF;
END PX;

挿入が行われるテーブルの構造ベース:

CREATE TABLE "DB"."M12GR" (
    "IDM12GR" NUMBER(10,0) NOT NULL ENABLE, 
    "CV" VARCHAR(5) NOT NULL ENABLE, 
    "SUP" FLOAT(126) NOT NULL ENABLE, 
    "IDM12" NUMBER(10,0) NOT NULL ENABLE, 

    CONSTRAINT "PRIMARY_30" PRIMARY KEY ("IDM12GR"),
    CONSTRAINT "M12SUELORM12" FOREIGN KEY ("IDM12") REFERENCES "DB"."M12" ("IDM12") ENABLE
)
5
Tililin Tin Tin

ORA-06512はエラースタックの一部です。例外が発生した行番号がわかりますが、例外の原因はわかりません。それは通常、残りのスタック(まだ投稿していない)で示されます。

あなたが言ったコメントで

「それでも、pNumが12と1​​4の間にない場合、エラーが発生します。pNumが12と1​​4の間にある場合、エラーは発生しません。」

さて、あなたのコードはこれを行います:

IF ((pNum < 12) OR (pNum > 14)) THEN     
    RAISE vSOME_EX;

つまり、pNumが12と1​​4の間にない場合、例外が発生します。それで、エラースタックの残りにこの行が含まれていますか?

ORA-06510: PL/SQL: unhandled user-defined exception

その場合は、例外ブロックを追加してエラーを処理するだけです。おそらく:

PROCEDURE PX(pNum INT,pIdM INT,pCv VARCHAR2,pSup FLOAT)
AS
    vSOME_EX EXCEPTION;

BEGIN 
    IF ((pNum < 12) OR (pNum > 14)) THEN     
        RAISE vSOME_EX;
    ELSE  
        EXECUTE IMMEDIATE  'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('||pCv||', '||pSup||', '||pIdM||')';
    END IF;
exception
    when vsome_ex then
         raise_application_error(-20000
                                 , 'This is not a valid table:  M'||pNum||'GR');

END PX;

ドキュメントでは、PL/SQL例外の詳細な処理について説明しています。

30
APC

変数pCvのタイプはVARCHAR2であるため、挿入を連結するときは、一重引用符で囲みません。

 EXECUTE IMMEDIATE  'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('''||pCv||''', '||pSup||', '||pIdM||')';

さらに、列に大きすぎる値を挿入しようとすると、エラーORA-06512が発生します。テーブルM_pNum_GRの定義と送信するパラメーターを確認してください。明確にするために、NUMERIC(2)フィールドに値100を挿入しようとすると、エラーが発生します。

私も同じエラーがありました。私の場合の理由は、テーブルに更新トリガーを作成し、そのトリガーの下で同じテーブルを再度更新することでした。そして、トリガーから更新ステートメントを削除したとき、私の問題は解決されました。

0
Ibrahim Danisg