Создать задание для запуска процедуры с переменной - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь создать JOB с этой формой:

BEGIN
  SYS.DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => 'OWNER.TEST_PROM'
      ,start_date      => TO_TIMESTAMP_TZ('2018/12/07 03:00:00.324000 -05:00','yyyy/mm/dd hh24:mi:ss.ff tzh:tzm')
      ,repeat_interval => 'freq=daily'
      ,end_date        => NULL
      ,job_class       => 'DEFAULT_JOB_CLASS'
      ,job_type        => 'PLSQL_BLOCK'
    ,job_action      => ' 

    BEGIN 

    DECLARE

    VAR_1    VARCHAR2(30) := '001';
    VAR_2    VARCHAR2(20) := '';
    VAR_3    VARCHAR2(20) := TO_CHAR(TO_DATE(SYSDATE-15),''YYYYMMDD'');
    VAR_4    VARCHAR2(20) := TO_CHAR(TO_DATE(SYSDATE),''YYYYMMDD'');    

    OWNER.LOAD_DATA_LOCAL.LOAD_PROM          (VAR_1,VAR_2,VAR_3,VAR_4); 
    OWNER.LOAD_DATA_LOCAL.LOAD_COB_PROM      (VAR_1,VAR_2,VAR_3,VAR_4);
    OWNER.LOAD_DATA_LOCAL.LOAD_CUP           (VAR_1,VAR_2,VAR_3,VAR_4); 
    end;'
    ,comments        => 'Ejecuta LOAD_prueba_cupones'
    );
end;
/

При запуске я получаю следующую ошибку:

Error at line 1
ORA-01756: quoted string not properly terminated
ORA-06512: at "SYS.DBMS_ISCHED", line 185
ORA-06512: at "SYS.DBMS_SCHEDULER", line 486
ORA-06512: at line 2

Script Terminated on line 1.

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Объявление job_action заключено в одинарные кавычки.Следовательно, вам нужно экранировать все одиночные кавычки, которые находятся внутри него, иначе Oracle не сможет правильно его проанализировать.

Поэтому вы должны заменить каждые ' на '' в job_action, а именно вобъявления VAR1 и VAR2 (VAR3 и VAR4 уже в порядке):

BEGIN
  SYS.DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => 'OWNER.TEST_PROM'
      ,start_date      => TO_TIMESTAMP_TZ('2018/12/07 03:00:00.324000 -05:00','yyyy/mm/dd hh24:mi:ss.ff tzh:tzm')
      ,repeat_interval => 'freq=daily'
      ,end_date        => NULL
      ,job_class       => 'DEFAULT_JOB_CLASS'
      ,job_type        => 'PLSQL_BLOCK'
    ,job_action      => ' 

    BEGIN 

    DECLARE

    VAR_1    VARCHAR2(30) := ''001'';
    VAR_2    VARCHAR2(20) := '''';
    VAR_3    VARCHAR2(20) := TO_CHAR(TO_DATE(SYSDATE-15),''YYYYMMDD'');
    VAR_4    VARCHAR2(20) := TO_CHAR(TO_DATE(SYSDATE),''YYYYMMDD'');    

    OWNER.LOAD_DATA_LOCAL.LOAD_PROM          (VAR_1,VAR_2,VAR_3,VAR_4); 
    OWNER.LOAD_DATA_LOCAL.LOAD_COB_PROM      (VAR_1,VAR_2,VAR_3,VAR_4);
    OWNER.LOAD_DATA_LOCAL.LOAD_CUP           (VAR_1,VAR_2,VAR_3,VAR_4); 
    end;'
    ,comments        => 'Ejecuta LOAD_prueba_cupones'
    );
end;
/

См. этот документ Oracle для примеров создания рабочих мест.

0 голосов
/ 19 декабря 2018

Или используйте строковую цитатную конструкцию Oracle q '[...]' и не беспокойтесь о количестве escape-кавычек:

 BEGIN
  SYS.DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => 'OWNER.TEST_PROM'
      ,start_date      => TO_TIMESTAMP_TZ('2018/12/07 03:00:00.324000 -05:00','yyyy/mm/dd hh24:mi:ss.ff tzh:tzm')
      ,repeat_interval => 'freq=daily'
      ,end_date        => NULL
      ,job_class       => 'DEFAULT_JOB_CLASS'
      ,job_type        => 'PLSQL_BLOCK'
    ,job_action      => q'[ 

    BEGIN 

    DECLARE

    VAR_1    VARCHAR2(30) := '001';
    VAR_2    VARCHAR2(20) := '';
    VAR_3    VARCHAR2(20) := TO_CHAR(TO_DATE(SYSDATE-15),'YYYYMMDD');
    VAR_4    VARCHAR2(20) := TO_CHAR(TO_DATE(SYSDATE),'YYYYMMDD');    

    OWNER.LOAD_DATA_LOCAL.LOAD_PROM          (VAR_1,VAR_2,VAR_3,VAR_4); 
    OWNER.LOAD_DATA_LOCAL.LOAD_COB_PROM      (VAR_1,VAR_2,VAR_3,VAR_4);
    OWNER.LOAD_DATA_LOCAL.LOAD_CUP           (VAR_1,VAR_2,VAR_3,VAR_4); 
    end;]'
    ,comments        => 'Ejecuta LOAD_prueba_cupones'
    );
end;
/
0 голосов
/ 18 декабря 2018

Попробуйте:

BEGIN 

DECLARE

VAR_1    VARCHAR2(30) := '001';
VAR_2    VARCHAR2(20) := '';
VAR_3    VARCHAR2(20) := TO_CHAR(TO_DATE(SYSDATE-15),'YYYYMMDD');
VAR_4    VARCHAR2(20) := TO_CHAR(TO_DATE(SYSDATE),'YYYYMMDD');    

begin
OWNER.LOAD_DATA_LOCAL.LOAD_PROM          (VAR_1,VAR_2,VAR_3,VAR_4); 
OWNER.LOAD_DATA_LOCAL.LOAD_COB_PROM      (VAR_1,VAR_2,VAR_3,VAR_4);
OWNER.LOAD_DATA_LOCAL.LOAD_CUP           (VAR_1,VAR_2,VAR_3,VAR_4); 
end;
--comments        => 'Ejecuta LOAD_prueba_cupones'
--);

end;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...