【问题标题】:Passing arguments to oracle stored procedure through scheduler job通过调度程序作业将参数传递给 oracle 存储过程
【发布时间】:2012-02-29 02:07:40
【问题描述】:

我有一个从 dbms 作业中调用的存储过程。即

DBMS_SCHEDULER.RUN_JOB ('Procedure_JB', FALSE);

一个java代码存储过程,在做一些事情之后,异步启动Procedure_JB。然后这个Procedure_JB调用Procedure_PROgram,然后程序会调用存储过程。

如何将参数传递给我的存储过程?

  • 我必须传递给作业的参数来自 java。

【问题讨论】:

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


    【解决方案1】:

    定义您的工作Procedure_JB 以接受参数。然后使用 dbms_scheduler.set_job_argument_value 定义要传递到作业将运行的程序的参数的值。一个例子(取自https://forums.oracle.com/forums/thread.jspa?threadID=483135

    -- create a stored procedure with two arguments
    create or replace procedure myproc (arg1 in varchar2, arg2 in varchar2)
    is BEGIN null; END;
    /
    
    -- create a program with two arguments and define both
    begin
    dbms_scheduler.create_program
    (
    program_name=>'myprog',
    program_action=>'myproc',
    program_type=>'STORED_PROCEDURE',
    number_of_arguments=>2, enabled=>FALSE
    ) ;
    
    dbms_scheduler.DEFINE_PROGRAM_ARGUMENT(
    program_name=>'myprog',
    argument_position=>1,
    argument_type=>'VARCHAR2',
    DEFAULT_VALUE=>'13');
    
    dbms_scheduler.DEFINE_PROGRAM_ARGUMENT(
    program_name=>'myprog',
    argument_position=>2,
    argument_type=>'VARCHAR2');
    
    dbms_scheduler.enable('myprog');
    end;
    /
    
    -- create a job pointing to a program and set both argument values
    begin
    dbms_scheduler.create_job('myjob',program_name=>'myprog');
    dbms_scheduler.set_job_argument_value('myjob',1,'first arg');
    dbms_scheduler.set_job_argument_value('myjob',2,'second arg');
    dbms_scheduler.enable('myjob');
    end;
    /
    

    【讨论】:

    • 噩梦可能是@AlexanderMills,但这是处理带有VARCHAR2 以外的参数的任意程序的通用方法。如果所有参数都是VARCHAR2 类型,那么可以简单地执行Steve G 建议的操作。
    【解决方案2】:

    改用 PLSQL_BLOCK:

    begin
    dbms_scheduler.create_job (
        job_name => 'myjob',
        job_type => 'PLSQL_BLOCK',
        job_action => 'BEGIN myproc(''first arg'',''second arg''); END;',
        start_date => sysdate,
        repeat_interval => 'FREQ=HOURLY',
        enabled => true    
    );
    end;
    /
    

    【讨论】:

    • 我 +rep 这个因为它是更简单的选择,但仅当参数是 VARCHAR2 类型时。如果过程需要其他东西(比如时间戳参数),那么这将不会发生。
    • 如果您需要异步运行作业,请跳过 SYSDATE 列。
    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 2015-09-10
    • 2023-03-22
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多