我这有一截动态SQL在存储过程中,运行一直报缺少关键字
ORA-00905: missing keyword,我排查应该就是这截sql,是真改不动了
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
根据提问者的描述,这段动态SQL语句存在问题,导致存储过程执行时报错。具体问题可能在于缺少了某个关键字或者语法不正确。为了解决这个问题,可以采取以下步骤:
仔细检查SQL语句,确保语法正确,没有缺少关键字或者语法错误。
将SQL语句拆分成多个子句,逐个执行,查看是否存在错误。可以通过执行SELECT语句,查看返回结果是否符合预期,或者通过执行EXPLAIN PLAN语句,查看SQL执行计划是否正确。
使用PL/SQL调试器,逐步执行存储过程,查看每一步执行的情况,找出错误原因。
如果还无法解决问题,可以考虑使用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函数将结果输出到控制台。