当我尝试创建以下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',
答案 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',