2011-10-19 9 views
1

それは私にORA-06512エラーOracleエラー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 
) 
+0

完全なエラースタックとは何ですか? ORA-06512は行番号です(それを含めると便利です)。実際のエラーはエラー・スタックにあります。 –

+0

ORA-06512:ON "DB.PX"、LINE 11 ORA-06512:ON LINE 12 –

+0

コメントを投稿するのではなく、追加情報を含めることができます。読みにくい。 – APC

答えて

20

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

を、あなたは

は「PNUM は、それが失敗しない12と14の間にあるとき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例外の処理について詳しく説明しています。 Find out more

1

変数をPCVはVARCHAR2型であるので、あなたは、単一引用符の内側にそれを入れていない挿入CONCATとき:

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

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

+0

これはペアになるのでできません。 VALUES( '' '|| pCv ||' ''、まだ、pNumが12と1​​4の間にないときにエラーが発生します.pNumが12と1​​4の間では失敗しません。 –

+1

あなたのすべての構造が同じであることを確認してください。 –

+0

'CREATE TABLE" DB "。" M12GR " \t(" IDM12GR "NUMBER(10,0)NOT NULL ENABLE、" CV "VARCHAR(5)NOT NULL\t \t CONSTRAINT "PRIMARY_30" PRIMARY KEY( "IDM12GR")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS(IDM12GR)を使用すると、記憶装置(初期65536次1048576長さ1最大値2147483645 PCTINCREASE 0 FREELISTS 1フリーリストグループ1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)テーブルスペース "DB" ENABLE、 \t \t CONSTRAINT "M12SUELORM12" FOREIGN KEY( "IDM12")REFERENCES "DB""M12"( "IDM12")ENABLE) ' –