1

DBMS_SCHEDULER を使用してバット ファイル ウィンドウを実行するためのスクリプトがあります。ただし、複数のデータでループするとエラーが発生します。

CREATE OR REPLACE procedure SEAT.ss_print_fundoshi_run_weld_tst (ptype varchar2)
is

cursor c_data is
select * from ss_print_fundoshi_tmp_file
where vdesc = ptype
order by vno;

vname varchar2(100);
v_dir varchar2(200) := 'SEATMAP';
fhandle            UTL_FILE.FILE_TYPE;

BEGIN
for i in c_data loop
 vname := 'RUNPRINT_WELD';-;
dbms_scheduler.drop_job (vname);
dbms_scheduler.create_job( 
job_name => vname,
job_type => 'EXECUTABLE',
job_action => 'C:\Windows\System32\cmd.exe',
job_class => 'DEFAULT_JOB_CLASS',
--comments => 'test job',
auto_drop => false,
number_of_arguments => 3,
enabled => FALSE);
dbms_scheduler.set_job_argument_value( job_name => vname, argument_position => 1, argument_value => '/q'); 
dbms_scheduler.set_job_argument_value( job_name => vname, argument_position => 2, argument_value => '/c'); 
dbms_scheduler.set_job_argument_value( job_name => vname, argument_position => 3, argument_value => '"'||i.vfile||'"'); 
dbms_scheduler.enable( vname);
dbms_lock.sleep(5);


end loop;

END;

しかし、いくつかのデータがあるため、ジョブは job_name RUNPRINT_WELD のジョブがまだ実行中であると言い続けているため、ジョブをドロップできません。

行が 1 つしかない場合は、正常に動作しています。

これに対する最善の解決策は何ですか?Tq

4

1 に答える 1

1

あなたは実際にそこにいます!

開始したジョブの終了を待つ必要がありRUNPRINT_WELDます-それよりも長くなる可能性があるようです5s->終了しない場合は、別のを待ち5sますdbms_lock.sleep (5). テーブルからデータを取得することでこれを行うことができdba_scheduler_running_jobsます: 実際に実行されているジョブ:

CREATE OR REPLACE procedure SEAT.ss_print_fundoshi_run_weld_tst (ptype varchar2)
is
  vname varchar2(100);
  v_cnt Number;
  v_dir varchar2(200) := 'SEATMAP';
  fhandle            UTL_FILE.FILE_TYPE;
BEGIN
  for i in (
        select sspf.*
          from ss_print_fundoshi_tmp_file sspf
         where vdesc = ptype
        order by vno;
  ) loop
   vname := 'RUNPRINT_WELD'; -- add a number after job name to differentiate
--   dbms_scheduler.drop_job (vname);  -- why drop it? you must find a way to decide if it really need to be dropped.
   dbms_scheduler.create_job( 
       job_name => vname,
       job_type => 'EXECUTABLE',
       job_action => 'C:\Windows\System32\cmd.exe',
       job_class => 'DEFAULT_JOB_CLASS',
       --comments => 'test job',
       auto_drop => false,
       number_of_arguments => 3,
       enabled => FALSE
    );
    dbms_scheduler.set_job_argument_value( job_name => vname, argument_position => 1, argument_value => '/q'); 
    dbms_scheduler.set_job_argument_value( job_name => vname, argument_position => 2, argument_value => '/c'); 
    dbms_scheduler.set_job_argument_value( job_name => vname, argument_position => 3, argument_value => '"'||i.vfile||'"'); 
    dbms_scheduler.enable( vname);
    -- a while loop to wait end of job
    v_cnt := 1;
    WHILE v_cnt>=1
    LOOP
      SELECT count(1) INTO v_cnt 
        FROM dba_scheduler_running_jobs srj
       WHERE srj.job_name IN ('RUNPRINT_WELD')
      ;
      IF v_cnt>0 THEN
        dbms_lock.sleep (5);
      END IF;
    END LOOP;
  end loop;
END;
/
于 2017-04-26T08:47:59.827 に答える