Oracle
將參數傳遞給由 DBMS_SCHEDULER 執行的過程
我有一個調度程序,它執行一個需要輸入參數的儲存過程。
BEGIN DBMS_SCHEDULER.DROP_PROGRAM (program_name => 'MYSCHEMA.EXPORT_SCHEMA_STARTING'); END; / BEGIN SYS.DBMS_SCHEDULER.CREATE_PROGRAM ( program_name => 'MYSCHEMA.EXPORT_SCHEMA_STARTING' ,program_type => 'STORED_PROCEDURE' ,program_action => 'MYSCHEMA.EXPORT_STATUS' ,number_of_arguments => 0 ,enabled => FALSE ,comments => NULL ); SYS.DBMS_SCHEDULER.ENABLE (name => 'MYSCHEMA.EXPORT_SCHEMA_STARTING'); END; /
如何將參數傳遞給
EXPORT_STATUS
程序?到目前為止,我將其更改為執行 PL/SQL BLOCK 的程序:
BEGIN SYS.DBMS_SCHEDULER.CREATE_PROGRAM ( program_name => 'MYSCHEMA.EXPORT_SCHEMA_STARTING' ,program_type => 'PLSQL_BLOCK' ,program_action => 'MYSCHEMA.EXPORT_STATUS(''STARTING''); END;' ,number_of_arguments => 0 ,enabled => FALSE ,comments => NULL ); SYS.DBMS_SCHEDULER.ENABLE (name => 'MYSCHEMA.EXPORT_SCHEMA_STARTING'); END; /
它按我的預期工作。但如果有人知道如何保持以前的格式,將不勝感激。
當您使用過程創建程序時
CREATE_PROGRAM
,您可以使用參數指定它期望的number_of_arguments
參數數量。如果出於某種原因,您想修改
number_of_arguments
現有調度程序對象(在我們的例子中為程序)的某些屬性(在我們的例子中),您不需要刪除該對象並再次使用新的屬性值重新創建它,您可以只使用SET_ATTRIBUTE
過程:dbms_scheduler.set_attribute( name => 'my_program' , attribute => 'number_of_arguments' , value => 1);
創建程序並設置其所有屬性後,您可以使用
DEFINE_PROGRAM_ARGUMENT
procedure定義程序的參數(如果有的話) :dbms_scheduler.define_program_argument( program_name => 'my_program' , argument_position => 1 , argument_type => 'VARCHAR2' , default_value => 'STARTING' );
在這裡,我們定義了程序參數及其預設值。我們可以不指定預設值,但在這種情況下,我們必須使用
SET_JOB_ARGUMENT_VALUE
procedure設置參數的值。例如,如果您創建了作業並指定了關聯的程序,如下所示:dbms_scheduler.create_job( job_name => 'call_my_program' , program_name => 'my_program' ... );
您必須以這種方式在與作業關聯的程序中設置參數的值:
dbms_scheduler.set_job_argument_value( job_name => 'call_my_program' , argument_position => 1 , argument_value => 'STARTING');
如果您已經為帶有
DEFINE_PROGRAM_ARGUMENT
過程的程序定義了參數的預設值,並且還使用過程設置了參數的值,那麼使用SET_JOB_ARGUMENT_VALUE
過程設置的參數值SET_JOB_ARGUMENT_VALUE
將覆蓋使用過程設置的預設參數值DEFINE_PROGRAM_ARGUMENT
。
- 創建另一個過程並在其中傳遞參數
- 用創建作業安排上述過程
CREATE OR REPLACE PROCEDURE XX_COPY_SALES_ORDER IS RETCD NUMBER; RETBUFF VARCHAR2(100); BEGIN XX_PROCESS_PKG.MAIN (RETCD,RETBUFF,NULL); END;
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'XX_COPY_SALES_ORDER', job_type => 'STORED_PROCEDURE', job_action => 'XX_COPY_SALES_ORDER', start_date => '07-MAY-16 07.00.00 PM US/Central', repeat_interval => 'FREQ=DAILY;INTERVAL=1', /* every other day */ end_date => '05-OCT-25 07.00.00 PM US/Central', auto_drop => FALSE, --job_class => 'batch_update_jobs', enabled => TRUE, comments => 'COMMETNS'); END;