質問

なぜそれが私に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
)
役に立ちましたか?

解決

ORA-06512はエラースタックの一部です。例外が発生したライン番号が得られますが、例外の原因は得られません。これは通常、スタックの残りの部分に示されています(まだ投稿していません)。

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

「それでも、PNUMが12〜14の間にない場合、エラーは発生します。PNUMが12〜14の場合、失敗しません」

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

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

つまり、PNUMが12から14の間でない場合、例外が生じます。エラースタックの残りの部分にはこの行が含まれていますか?

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の例外の取り扱いを詳細にカバーしています。

他のヒント

変数PCVはvarchar2のタイプであるため、挿入物を連結すると、単一の引用符の中に入れていません。

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

さらに、列に大きすぎる値を挿入しようとしている場合、ERROR-06512が上昇します。テーブルm_pnum_grの定義と送信しているパラメーターを確認してください。数値(2)フィールドに値100を挿入しようとする場合にのみ、エラーが増加します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top