Ошибка ORA-25448 при создании правила цепочки заданий с использованием dbms_scheduler.define_chain_rule

Когда я пытаюсь создать следующее правило цепочки оракулов:

BEGIN
   SYS.DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
     chain_name   =>   'MIGRATE_EISDB_CHAIN',
     condition    =>   ':MIGRATION_STEP_1.state=''RUNNING'' AND select decode(TIME_COMPLETED, null, 0, 1) from MIGRATION_PROGRESS where MIGRATION_STEP = "MIGRATE_AEP_TO_EP" > 0',
     rule_name    =>   'continue_migration',
     action       =>   'START MIGRATION_STEP_2',
     comments     =>   'continue the migration - step 2');
END;

/

Цепочка, шаги и первое правило были созданы успешно, но я получаю эту ошибку при создании второго правила с условием:

Отчет об ошибке -
ORA-25448: правило EISYSNEW1.CONTINUE_MIGRATION содержит ошибки
ORA-00936: отсутствует выражение
ORA-06512: at "SYS.DBMS_ISCHED", строка 1646
ORA-06512: at " SYS.DBMS_SCHEDULER", строка 1619
ORA-06512: строка 2
25448. 00000 - "%s %s.%s содержит ошибки."
*Причина: попытка загрузить указанное правило или выражение не удалось из-за
ошибок в правиле или выражении.
*Действие: проверьте правило или выражение и повторите операцию.

Вопрос:

Почему это происходит?? В документации Oracle сказано, что это условие должно быть законным. Что мне не хватает в выражении для этого условия?? К вашему сведению: он создается, когда я опускаю часть после «И».

condition    =>   ':MIGRATION_STEP_1.state=''RUNNING'' AND select decode(TIME_COMPLETED, null, 0, 1) from MIGRATION_PROGRESS where MIGRATION_STEP = "MIGRATE_AEP_TO_EP" > 0',

person Bixxman    schedule 30.11.2016    source источник


Ответы (1)


Я не вижу, где в документации Oracle говорится, что это условие является законным. Мне это не кажется слишком законным.

Вам нужно сделать вложенный SELECT подзапросом, заключив его в круглые скобки. Если MIGRATE_AEP_TO_EP не является именем столбца, вы также можете заменить двойные кавычки вокруг MIGRATE_AEP_TO_EP на одинарные кавычки. Поскольку само правило является строковым литералом, вам нужно будет экранировать каждую из одинарных кавычек второй одинарной кавычкой, как в случае с RUNNING:

 condition    =>   ':MIGRATION_STEP_1.state=''RUNNING'' AND (select decode(TIME_COMPLETED, null, 0, 1) from MIGRATION_PROGRESS where MIGRATION_STEP = ''MIGRATE_AEP_TO_EP'') > 0',
person Luke Woodward    schedule 30.11.2016