Установить именованный параметр для хранимой процедуры Oracle dbms_scheduler

Можно ли передать именованные аргументы для задания dbms_scheduler с типом stored_procedure? Я пробовал вот так:

-- 1) example dummy procdure
CREATE OR REPLACE PROCEDURE my_test_proc (
 param1 IN NVARCHAR2,
 param2 IN NUMBER,
 param3 IN NUMBER
) IS
BEGIN
-- ...
END;

-- 2)Example dummy job:
BEGIN    
    dbms_scheduler.create_job(
        job_name => 'my_test_job'
        ,job_type => 'STORED_PROCEDURE'
        ,job_action => 'my_test_proc'
        ,start_date => sysdate
        ,number_of_arguments => 3
        ,enabled => FALSE
        ,auto_drop =>FALSE
    );
END;
-- 3)Set named param value:
BEGIN  
    dbms_scheduler.set_job_argument_value(
        job_name => 'my_test_job'
        ,argument_name => 'param1' 
        ,argument_value => 'some value'
    );
END;  

Я получаю следующую ошибку: ORA

-27484: имена аргументов не поддерживаются для заданий без программы. ORA-06512: в «SYS.DBMS_ISCHED», строка 207 ORA-06512: в «SYS.DBMS_SCHEDULER», строка 602 ORA-06512: в строке 2

Я успешно установил значения параметров с помощью set_job_argument_value, используя параметр argument_position. Но могут быть случаи, когда мне нужно будет запустить хранимые процедуры, для которых мне нужно будет установить только определенные параметры, и это не может сработать. Есть ли способ передать именованный аргумент в хранимую процедуру, запущенную заданием планировщика?


person skujins    schedule 22.01.2013    source источник


Ответы (2)


как указано в сообщении об ошибке, сначала создайте программу, а затем уже приступайте к работе над ней.

dbms_scheduler.create_program(program_name        => 'YOUR_PROGRAM',
                              program_type        => 'STORED_PROCEDURE',                                                          
                              program_action      => 'my_test_proc', 
                              number_of_arguments => 2,
                              enabled             => false,
                              comments            => 'Comments you want');

dbms_scheduler.define_program_argument(program_name      => 'YOUR_PROGRAM',
                                       argument_name     => 'param1',
                                       argument_position => 1,
                                       argument_type     => 'VARCHAR2',
                                       default_value     => '');
    ..etc, do for all 3.                                         

dbms_scheduler.enable (name => 'YOUR_PROGRAM');


dbms_scheduler.create_job(job_name        => 'my_test_job',
                          program_name    => 'YOUR_PROGRAM',
                          start_date      => systimestamp,
                          end_date        => null,
                          ...

dbms_scheduler.set_job_argument_value(job_name          => 'my_test_job',
                                      argument_position => 1,
                                      argument_value    => 'value');
  ...
person DazzaL    schedule 22.01.2013
comment
Создал свой тестовый пример, следуя предоставленным вами советам. Но я все еще не могу понять, как установить именованный аргумент в stored_procedure. В качестве параметра define_program_argument может быть передан только параметр arguments_position в соответствии с документацией. Я начинаю думать, что это не может быть выполнено таким образом, и мне нужно создать какую-то динамическую строку для вызова SP? - person skujins; 22.01.2013
comment
@Skuja определяет аргумент PROGRAM принимает аргумент имя (не совсем имя параметра, но могло быть) + фактическая позиция. Аргумент define JOB принимает только позицию (или имя, если хотите ... есть два перегруженных API), и это должно быть связано с позицией / именем аргумента программы. - person DazzaL; 22.01.2013

У меня есть базовый пример процедуры

1.- СОЗДАТЬ ПРОЦЕДУРУ

CREATE OR REPLACE PROCEDURE MY_TEST_PROCEDURE (P_VAR1 VARCHAR2, P_VAR_NUMBER NUMBER)
AS 
    V_RESULT_MSG VARCHAR2(300);
BEGIN
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MI'));
    V_RESULT_MSG := P_VAR1;
    V_RESULT_MSG := V_RESULT_MSG||' '||P_VAR_NUMBER;

    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MI'));
    DBMS_OUTPUT.PUT_LINE(V_RESULT_MSG);
END MY_TEST_PROCEDURE;

2.- СОЗДАТЬ ПРОГРАММУ

BEGIN
    DBMS_SCHEDULER.CREATE_PROGRAM(
        PROGRAM_NAME => 'MY_TEST_PROGRAM'
        ,PROGRAM_TYPE => 'STORED_PROCEDURE'
        ,PROGRAM_ACTION => 'MY_TEST_PROCEDURE'
        ,NUMBER_OF_ARGUMENTS => 2
        ,ENABLED =>  FALSE
        ,COMMENTS => 'my test program'
    );

    DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(
        PROGRAM_NAME => 'MY_TEST_PROGRAM',
        argument_name     => 'P_VAR1',
        argument_position => 1,
        argument_type     => 'VARCHAR2',
        default_value     => ''
    );

    DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(
        PROGRAM_NAME => 'MY_TEST_PROGRAM',
        argument_name     => 'P_VAR_NUMBER',
        argument_position => 2,
        argument_type     => 'NUMBER',
        default_value     => ''
    );

    dbms_scheduler.enable (name => 'MY_TEST_PROGRAM');

END;

3.- СОЗДАТЬ ЗАДАНИЕ

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
        job_name => '"XXFLM"."MY_TEST_JOB"',
        PROGRAM_NAME => 'MY_TEST_PROGRAM'
    );

END;

4.- ТЕСТ КОДА PL / SQL

DECLARE
    V_VAR1 VARCHAR2(50) := 'HOLA';
    V_VAR2 NUMBER  := 2010;

BEGIN

    dbms_scheduler.set_job_argument_value(
        job_name          => 'MY_TEST_JOB',
        argument_position => 1,
        argument_value    => V_VAR1);

    dbms_scheduler.set_job_argument_value(
        job_name          => 'MY_TEST_JOB',
        argument_position => 2,
        argument_value    => V_VAR2);

    DBMS_SCHEDULER.RUN_JOB(
        JOB_NAME            => '"XXFLM"."MY_TEST_JOB"',
        USE_CURRENT_SESSION => FALSE);

END;

5.- РЕЗУЛЬТАТ

SELECT * FROM ALL_SCHEDULER_JOB_RUN_DETAILS ORDER BY 1 DESC;
person user3003234    schedule 29.04.2020