【问题标题】:Procedure not executing程序未执行
【发布时间】:2012-09-25 05:12:08
【问题描述】:

我有以下过程,但没有创建调度程序作业,并且在运行作业时找不到任何错误。我该如何调试它以及代码有什么问题?

CREATE OR REPLACE PROCEDURE test
IS
prod_no varchar2(32);
prod_date date;
employee varchar2(32);
assurer varchar2(32);
prod_description varchar2(32);
prod_days number;
assig varchar2(32);
reg_no number;
l_v number;

BEGIN

prod_no := '300';
prod_date  := sysdate;
employee := 'SAM';
assurer := 'MAT';
prod_description := 'test';
prod_days := 1;
assig := 'A';
reg_no := 1;

DBMS_SCHEDULER.create_job (
                    job_name      => DBMS_SCHEDULER.generate_job_name ('FR'),
                    job_type      => 'PLSQL_BLOCK',
                    job_action     =>    'BEGIN test_job('
                                        || i_prod_no
                                        || ','''
                                        || prod_date
                                        || ','''
                                        || employee 
                                        || ','''
                                        || assurer
                                        || ','''
                                        || prod_description
                                        || ','''
                                        || prod_days
                                        || ','''
                                        || assig
                                        || ','''
                                        || reg_no
                                        || '''); end;',
                    start_date     => SYSDATE,                   
                    end_date      => NULL,
                    enabled         => TRUE,
                    comments      => 'test product'
                );

    commit;

exception
when others then

dbms_output.put_line (dbms_utility.format_error_stack);
END test;
/

【问题讨论】:

  • 尝试两件事:(1) SET SERVEROUT ON; (2) 去掉不必要的异常处理程序。
  • @JeffreyKemp 我已经添加了DBMS_OUTPUT.put_line('Products'); 并且正在执行。

标签: oracle stored-procedures plsql oracle10g dbms-scheduler


【解决方案1】:

如果作业操作在语法上不正确,您将不会收到任何警告,但您也不会得到作业。 这是您的声明:

BEGIN test_job(300,'04-OCT-12,'SAM,'MAT,'test,'1,'A,'1'); end;

您缺少一些 ' 来关闭字符串值。

CREATE OR REPLACE PROCEDURE test
IS
prod_no varchar2(32);
prod_date date;
employee varchar2(32);
assurer varchar2(32);
prod_description varchar2(32);
prod_days number;
assig varchar2(32);
reg_no number;
l_v number;
l_statement varchar2(32767);

BEGIN

prod_no := '300';
prod_date  := sysdate;
employee := 'SAM';
assurer := 'MAT';
prod_description := 'test';
prod_days := 1;
assig := 'A';
reg_no := 1;

l_statement :=  'BEGIN test_job('
                                        || i_prod_no
                                        || ','''
                                        || prod_date
                                        || ','''
                                        || employee 
                                        || ','''
                                        || assurer
                                        || ','''
                                        || prod_description
                                        || ','''
                                        || prod_days
                                        || ','''
                                        || assig
                                        || ','''
                                        || reg_no
                                        || '''); end;'

dbms_output.put_line(l_statement);

DBMS_SCHEDULER.create_job (
                    job_name      => DBMS_SCHEDULER.generate_job_name ('FR'),
                    job_type      => 'PLSQL_BLOCK',
                    job_action     =>  l_statement,
                    start_date     => SYSDATE,                   
                    end_date      => NULL,
                    enabled         => TRUE,
                    comments      => 'test product'
                );

    commit;

exception
when others then

dbms_output.put_line (dbms_utility.format_error_stack);
END test;
/

【讨论】:

  • 您如何设法获取 test_job 中的值? BEGIN test_job(300,'04-OCT-12,'SAM,'MAT,'test,'1,'A,'1'); end;
  • 在字符串变量中构建您的 plsql 块并在将其传递给 dbms_job.create_job 之前将其打印出来。我将编辑我的答案。
  • 另一个问题是哪个表有调度程序作业的详细信息,我尝试在dba_scheduler_programs中查询,但是当我创建一个没有参数的作业调度程序时找不到。
猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多