DBMS_SCHEDULERを使用したプロシージャのスケジューリング。PLS-00103:次のいずれかが必要なときに記号「NULL」が発生しました:;

Aug 21 2020

実行するジョブをスケジュールできません。

CSVファイルを書き込むプロシージャを作成しましたが、実行すると機能します。

それから私はそれをスケジュールするために仕事をしようとしました:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name => 'AUTOMATE_CSV_EXPORT',
    job_type => 'STORED_PROCEDURE',
    job_action => 'EXPORT_ALL_LYS_FOR_TABLEAU',
    number_of_arguments => 0,
    start_date => '20-AUG-20 2.05.00PM',
    repeat_interval => 'FREQ=WEEKLY; BYDAY=FRI; BYHOUR=23;',
    end_date => NULL,
    enabled => FALSE,
    auto_drop => FALSE,
    comments => 'hello i am a comment');

  DBMS_SCHEDULER.SET_ATTRIBUTE( 
    name => 'AUTOMATE_CSV_EXPORT', 
    attribute => 'logging_level', 
    value => DBMS_SCHEDULER.LOGGING_RUNS);
  
  DBMS_SCHEDULER.enable(
    name => 'AUTOMATE_CSV_EXPORT');
END;
/

スケジュールされた時間には実行されませんでしたが、次のように実行したときに実行されました。

ウィザードで開始時刻を編集しようとしましたが、次のエラーが発生します。

少し前から2分おきに実行するようにスケジュールしましたが、まだ実行されていません。間違いなく有効になっています。


トラブルシューティング

TLDR:スケジューラーは機能します!!! うまくいかないのは、通知を受け取るためにメールを入力することだけです。

  1. 作成したのと同じスキーマで実行していますか?

2分ごとに実行するようにジョブを変更しました。

^^^それで動作していますか?しかし、宛先フォルダーにCSVが表示されません。以下のコードのように開始日をNULLに変更しましたが、機能しました。CSVがあります!

  1. スケジュールされたジョブのテスト:テスト:
create or replace procedure test_print
is
begin
    dbms_output.put_line('Current date and time is : ' || 
    to_char(sysdate,'DD-MON-YYYY HH:MI:SS AM'));
end;

set serveroutput on;

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
    job_name => 'JOB_TEST',
    job_type => 'STORED_PROCEDURE',
    job_action => 'TEST_PRINT',
    number_of_arguments => 0,
    start_date => NULL,
    repeat_interval => 'FREQ=MINUTELY;INTERVAL=2;',
    end_date => NULL,
    enabled => FALSE,
    auto_drop => FALSE,
    comments => 'Testing job runs');
 
DBMS_SCHEDULER.enable(name => 'JOB_TEST');
END;
/

select job_name,output,status,owner 
from user_scheduler_job_run_details where  job_name='JOB_TEST';

結果:

それでも機能しないのは、電子メールによる通知です。それが私が編集する唯一のものであるとき、私はこのエラーを受け取ります:

回答

2 Noname Aug 21 2020 at 10:15

ほとんどの場合、異なるスキーマでオブジェクトを作成し、これらのビューuser_scheduler_jobsを使用して現在のスキーマで作成されたジョブとジョブの詳細を確認し、user_scheduler_job_run_details

2分ごとに実行するようにスケジュールされた簡単な手順

  SQL>create or replace procedure test_print
      2  is
      3  begin
      4  dbms_output.put_line('Current date and time is : ' || to_char(sysdate,'DD-MON-YYYY HH:MI:SS AM'));
      5* end;
    SQL> /
    
    Procedure created.
    
    SQL> exec test_print();
    Current date and time is : 20-08-2020 09:22:59 PM
    
    PL/SQL procedure successfully completed.
    
    
    SQL> BEGIN
      2             DBMS_SCHEDULER.CREATE_JOB (
      3              job_name => 'JOB_TEST',
      4              job_type => 'STORED_PROCEDURE',
      5              job_action => 'TEST_PRINT',
      6              number_of_arguments => 0,
      7              start_date => NULL,
      8              repeat_interval => 'FREQ=MINUTELY;INTERVAL=2;',
      9              end_date => NULL,
     10              enabled => FALSE,
     11              auto_drop => FALSE,
     12              comments => 'Testing job runs');
     13
     14
     15
     16
     17
     18              DBMS_SCHEDULER.enable(
     19               name => 'JOB_TEST');
     20  END;
     21  /
     
  SQL> select job_name,output,status from user_scheduler_job_run_details
       2  where  job_name='JOB_TEST';

JOB_NAME   OUTPUT                                             STATUS
---------- -------------------------------------------------- ---------------
JOB_TEST   Current date and time is :20-08-2020 09:30:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:32:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:34:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:36:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:38:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:40:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:42:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:44:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:46:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-08-2020 09:48:05 PM   SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 09:50:05 PM  SUCCEEDED -- Modified date format in procedure
JOB_TEST   Current date and time is :20-AUG-2020 09:52:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 09:54:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 09:58:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 10:02:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 10:04:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 09:56:05 PM  SUCCEEDED
JOB_TEST   Current date and time is :20-AUG-2020 10:00:05 PM  SUCCEEDED

18 rows selected.


SQL> select job_name,last_start_date,last_run_duration from user_scheduler_jobs
  2  where job_name='JOB_TEST';

JOB_NAME   LAST_START_DATE                                    LAST_RUN_DURATION
---------- -------------------------------------------------- ------------------------------
JOB_TEST   20-AUG-20 10.08.05.070000 PM US/CENTRAL            +000000000 00:00:00.009000

編集:-ジョブを手動で実行できたが、スケジューラーから実行できなかったことを観察するだけで、ジョブとプロシージャが同じスキーマにないことを意味します。