0

DDL ステートメントを使用する DBMS_JOB (セキュリティ上の理由から DBMS_SCHEDULER は使用できません) を使用してジョブをスケジュールしようとしています。

DECLARE
job_num NUMBER;
BEGIN
DBMS_JOB.SUBMIT(job => job_num,
what => 'BEGIN EXECUTE IMMEDIATE ''CREATE TABLE temp1 (ID NUMBER)''; END;'
);
DBMS_OUTPUT.PUT_LINE('JobID'||job_num);
DBMS_JOB.RUN(job_num);
END;
/

エラーメッセージが表示されて実行に失敗します:

ORA-12011: 1 つのジョブの実行に失敗しました ORA-06512: "SYS.DBMS_IJOB"、548 行目 ORA-06512: "SYS.DBMS_JOB"、278 行目 ORA-06512: 8 行目

無名ブロック内からDBMS_JOB.RUN()ステートメントを削除すると、少なくともジョブを作成 (および保存) できます。 ジョブを確認すると、 BEGIN EXECUTE IMMEDIATE 'CREATE TABLE temp1 (id NUMBER) ';を実行するコードとしてこれが保存されてい ます。終わり;

スタンドアロンで実行すると、明らかに実行されます。DBMS_JOB.RUN() を呼び出して全体を実行しようとしたときにのみ失敗します。

DDL ステートメントを DBMS_JOB のパラメーターとして使用することに制限はありますか? これに関するドキュメントにはポインタが見つかりません。

4

1 に答える 1

2

他のコメンテーターの意見を反映しながら - その場でテーブルを作成することは、多くの場合、グローバル一時テーブルを本当に使用する必要があることを示す危険信号です - いくつか質問があります。

  1. 電話が必要な理由はありDBMS_JOB.RUNますか?への呼び出しDBMS_JOB.SUBMITは、親トランザクションがコミットされるとすぐに非同期でジョブを実行するようにOracleに指示しています。したがって、通常は、呼び出しDBMS_JOB.SUBMITてから、単に「COMMIT」を実行します。
  2. ジョブをサブミットしているユーザーにCREATE TABLE直接権限が付与されていますか? 私の推測では、ユーザーはCREATE TABLEロールを介して付与された権限しか持っていません。これにより、無名 PL/SQL ブロックをインタラクティブに実行できますが、ジョブでは実行できません。CREATE TABLEその場合は、DBA がロールを介してではなく直接権限を付与する必要があります。
  3. ジョブが失敗すると、エントリがエラー メッセージと共にアラート ログに書き込まれます。あなた (または、DBA の方が可能性が高い) は、アラート ログからエラー メッセージとエラー スタックを取得し、ここに投稿できますか (#2 の権限の問題以外の何かであると仮定します)。
于 2012-05-25T13:17:27.917 に答える