使用dbms_scheduler.define_chain_rule创建作业链规则时出现错误ORA-25448

时间:2016-11-30 19:31:01

标签: oracle oracle11g dbms-scheduler

当我尝试创建以下oracle链规则时:

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:在“SYS.DBMS_SCHEDULER”,   1619号线ORA-06512:第2行   25448. 00000 - “%s%s。%s有错误。”
  *原因:尝试加载指定的规则或表达式失败              对规则或表达中的错误。
  *操作:检查规则或表达式,然后重试该操作。

问题:

为什么会这样? Oracle的文档说这种情况应该是合法的。我在这个条件的表达中缺少什么?仅供参考:当我省略'AND'之后的部分时,确实会创建。

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',

1 个答案:

答案 0 :(得分:0)

我不知道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',