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:スケジューラーは機能します!!! うまくいかないのは、通知を受け取るためにメールを入力することだけです。
- 作成したのと同じスキーマで実行していますか?
2分ごとに実行するようにジョブを変更しました。

- スケジュールされたジョブのテスト:テスト:
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
編集:-ジョブを手動で実行できたが、スケジューラーから実行できなかったことを観察するだけで、ジョブとプロシージャが同じスキーマにないことを意味します。