【问题标题】:Oracle DBMS_SCHEDULER looping found error ORA-274278Oracle DBMS_SCHEDULER 循环发现错误 ORA-274278
【发布时间】:2017-09-23 12:17:29
【问题描述】:

我有一些使用 DBMS_SCHEDULER 运行 bat 文件窗口的脚本。但是当有多个数据循环时会出现一些错误。

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;

但是因为有几个数据,所以作业一直说作业名称为 RUNPRINT_WELD 的作业仍在运行,所以它不能丢弃作业。

如果只有一排,则运行良好。

什么是最好的解决方案?Tq

【问题讨论】:

    标签: oracle plsql oracle11g dbms-scheduler dbms-job


    【解决方案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;
    /
    

    【讨论】:

    • 感谢您的回复.. 我已尝试使用您的解决方案,但它无法删除,因为会显示错误 job_name 不存在。我的目标只是循环几个数据以使用 dbms_scheduler 运行 bat 文件,但是在新行时它一直显示错误(因为当前作业尚未完成)
    • 它将并行运行,我希望它串行运行。
    • @reefman,它是否与 while 循环一起工作以等待工作完成?
    • 谢谢@j-chomel,我会尽快用你的方法报告结果,因为现在我只是添加dbms_lock.sleep(20)。
    猜你喜欢
    • 2017-10-14
    • 2012-05-17
    • 2015-08-06
    • 2012-01-06
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多