存储过程执行动态SQL报错

我这有一截动态SQL在存储过程中,运行一直报缺少关键字
ORA-00905: missing keyword,我排查应该就是这截sql,是真改不动了

img

SELECT

CASE WHEN '||RuleType||' = '预警规则' THEN

         CASE WHEN    upper('||UseableRule||') LIKE '%CONTROL_END_DATE%'  THEN

                  WHEN '||RuleType||' = '提醒规则' THEN

    '['||PROJECT_NAMEs||','||TO_CHAR(TRUNC(SYSDATE)- TRUNC(CONTROL_END_DATE))||']'

    ELSE

    '['||PROJECT_NAMEs||','||TO_CHAR(TRUNC(SYSDATE)- TRUNC(PLAN_END_DATE))||']' END

    CASE WHEN    upper('||UseableRule||') LIKE '%CONTROL_END_DATE%'  THEN

    '['||PERSON_Names||','||NODE_NAME||','||TO_CHAR(TRUNC(CONTROL_END_DATE)-TRUNC(SYSDATE))||',]'

    ELSE

    '['||PERSON_Names||','||NODE_NAME||','||TO_CHAR(TRUNC(PLAN_END_DATE)-TRUNC(SYSDATE))||',]' end  END AS smsParams

FROM dual

你这看起来太乱了,case到哪一级都不好分辨,能换成decode就换decode试试,不能换就一个一个的写,看是哪个case when的问题

你这语法都是错的呀,我在原来的基础上 '测试' 和 WHEN '||RuleType||' <> '预警规则' THEN 这两段,就可以运行了。当然dual需要替换成你自己的表

SELECT CASE
         WHEN '||RuleType||' = '预警规则' THEN
         
          CASE
            WHEN UPPER('||UseableRule||') LIKE '%CONTROL_END_DATE%' THEN
                 '测试'
            WHEN '||RuleType||' = '提醒规则' THEN
            
             '[' || PROJECT_NAMES || ',' ||
             TO_CHAR(TRUNC(SYSDATE) - TRUNC(CONTROL_END_DATE)) || ']'
          
            ELSE
            
             '[' || PROJECT_NAMES || ',' ||
             TO_CHAR(TRUNC(SYSDATE) - TRUNC(PLAN_END_DATE)) || ']'
          END
        WHEN '||RuleType||' <> '预警规则' THEN         
          CASE
            WHEN UPPER('||UseableRule||') LIKE '%CONTROL_END_DATE%' THEN
            
             '[' || PERSON_NAMES || ',' || NODE_NAME || ',' ||
             TO_CHAR(TRUNC(CONTROL_END_DATE) - TRUNC(SYSDATE)) || ',]'
          
            ELSE
            
             '[' || PERSON_NAMES || ',' || NODE_NAME || ',' ||
             TO_CHAR(TRUNC(PLAN_END_DATE) - TRUNC(SYSDATE)) || ',]'
          END
       END AS SMSPARAMS
  FROM DUAL

你这sql写的有点混乱啊,你那个第一个then出现之后,后面应该写结果,都没有结果

-- 正确的语法格式:
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE result
END

另外你的这个语句东西太多,下面只是改了部分的修正,你参考一下

CASE WHEN '||RuleType||' = '预警规则' THEN
CASE WHEN upper('||UseableRule||') LIKE '%CONTROL_END_DATE%' THEN
'['||PROJECT_NAMEs||','||TO_CHAR(TRUNC(SYSDATE)-TRUNC(CONTROL_END_DATE))||']'
END
WHEN '||RuleType||' = '提醒规则' THEN
CASE WHEN upper('||UseableRule||') LIKE '%CONTROL_END_DATE%' THEN
'['||PERSON_Names||','||NODE_NAME||','||TO_CHAR(TRUNC(CONTROL_END_DATE)-TRUNC(SYSDATE))||',]'
ELSE
'['||PERSON_Names||','||NODE_NAME||','||TO_CHAR(TRUNC(PLAN_END_DATE)-TRUNC(SYSDATE))||',]'
END
END AS smsParams

以下内容部分参考ChatGPT模型:


根据提问者的描述,这段动态SQL语句存在问题,导致存储过程执行时报错。具体问题可能在于缺少了某个关键字或者语法不正确。为了解决这个问题,可以采取以下步骤:

  1. 仔细检查SQL语句,确保语法正确,没有缺少关键字或者语法错误。

  2. 将SQL语句拆分成多个子句,逐个执行,查看是否存在错误。可以通过执行SELECT语句,查看返回结果是否符合预期,或者通过执行EXPLAIN PLAN语句,查看SQL执行计划是否正确。

  3. 使用PL/SQL调试器,逐步执行存储过程,查看每一步执行的情况,找出错误原因。

  4. 如果还无法解决问题,可以考虑使用Oracle提供的SQL Trace功能,跟踪SQL语句执行的过程,找出问题所在。

下面是一个示例代码,用于执行动态SQL语句并返回结果:

DECLARE
  v_sql VARCHAR2(200);
  v_result NUMBER;
BEGIN
  v_sql := 'SELECT COUNT(*) FROM employees';
  EXECUTE IMMEDIATE v_sql INTO v_result;
  DBMS_OUTPUT.PUT_LINE('Total employees: ' || v_result);
END;

在这个示例中,我们定义了一个变量v_sql来存储动态SQL语句,然后使用EXECUTE IMMEDIATE语句执行SQL语句,并将结果存储到变量v_result中。最后,使用DBMS_OUTPUT.PUT_LINE函数将结果输出到控制台。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快