2017-04-27 44 views
1

PLSQL関数では、ログ・テーブルにログを書き込むために、プロシージャ(コミット・ステートメントを含む)をコールしています。だから、プロシージャまたは関数を呼び出すと、コミットが含まれている場合、私は、理解して私はORA-14552を取得しますが、私はプラグマAUTONOMOUS_TRANSACTIONのようにそれを手渡していていてもPLSQL:ORA-14552 DDLを実行できません。Commit

CREATE OR REPLACE FUNCTION MYFUNCTION 
(--IN PARAMETERS) 
BEGIN 

---Some select statements 
PR_LOGGER(logmessage); 
BEGIN 
EXECUTE IMMEDIATE 'DROP TABLE tablename'; 
EXCEPTION WHEN OTHERS 
    IF (SQLCODE !=942) THEN 
    PR_LOGGER(SQLERRM); 
    END IF; 
END; 
return NULL; 
END; 

:だから私は

CREATE OR REPLACE PROCEDURE PR_LOGGER 
(IN PARAMETERS-----) 
IS Pragma Autonomous_transaction 
BEGIN 

--Insert statements 

Commit; 
END; 

呼び出し元の関数としてそれを宣言しましたそのエラーを避けるために、私はまだ同じエラーを取得しています。どのようなアイデアを私は間違っていますか?お知らせ下さい。

答えて

3

DROP TABLEステートメントは暗黙のコミットを引き起こします。

PRAGMAは、PROCEDUREの実行にのみ適用されます。

DROP TABLEは、手順のコンテキストでは実行されません。これは、文脈で実行されたFUNCTIONの体内にあります。

+0

ありがとうございます。自分の機能の中にドロップテーブルを使用しないでください。あなたはそれを行うための最良の方法を助言することができます – Karthik

+0

右。 FUNCTIONのコンテキストでDDL操作を実行しないでください。自律的なトランザクションを使用してコミットを行う方法をすでに理解しています。 DROP TABLEでも同じことができます。これをPROCEDUREに入れ、FUNCTIONからプロシージャーを呼び出します。 – spencer7593

+0

ありがとうございます:)それを試みます – Karthik

関連する問題