TOAD环境Oracle用CASE多条件UPDATE报ORA-00905错误如何解决
错误原因分析
- SET子句语法不符合Oracle规范:UPDATE语句的SET关键字后,多列赋值无需为每个赋值语句单独包裹括号,直接用逗号分隔多个列的赋值逻辑即可,多余的括号会触发语法解析错误。
- CASE表达式存在多处语法问题:
- 简单CASE与搜索CASE逻辑混淆:原语句在CASE后指定了
Expiry_DTS字段,但后续WHEN子句判断的是cd字段的值,逻辑完全不匹配,需要改为搜索CASE写法,直接在WHEN后写判断条件。 - THEN子句冗余:CASE表达式本身直接返回要赋值给
Expiry_DTS的最终值,不需要在THEN后重复写Expiry_DTS =前缀。 - 括号闭合位置错误:原语句将CASE表达式的结束标识
END放在了括号外侧,导致语法结构断裂。
- 简单CASE与搜索CASE逻辑混淆:原语句在CASE后指定了
- 日期隐式转换风险:依赖会话级的
nls_date_format隐式转换字符串为日期,容易在不同环境下因格式配置不同报错,建议显式使用TO_DATE函数做日期转换。
修正后的完整可运行脚本
-- 修改会话日期格式 ALTER SESSION SET nls_date_format = 'DD/MM/YYYY HH24:MI:SS'; -- 修正后的UPDATE语句 UPDATE Qualifications_t SET COMMENTS = 'Task', Expiry_DTS = CASE WHEN cd = '1' THEN TO_DATE('31/12/2016 23:59:00', 'DD/MM/YYYY HH24:MI:SS') WHEN cd = '2' THEN TO_DATE('01/07/2019 23:59:00', 'DD/MM/YYYY HH24:MI:SS') WHEN cd = '3' THEN TO_DATE('31/12/1999 23:59:00', 'DD/MM/YYYY HH24:MI:SS') WHEN cd = '4' THEN TO_DATE('31/08/2021 23:59:00', 'DD/MM/YYYY HH24:MI:SS') WHEN cd = '5' THEN TO_DATE('17/06/2021 23:59:00', 'DD/MM/YYYY HH24:MI:SS') -- cd不在上述枚举值时保留原NULL值,可根据业务需求调整 ELSE Expiry_DTS END WHERE EXPIRY_DTS IS NULL; -- 验证更新结果 SELECT * FROM QUALIFICATIONS_T WHERE COMMENTS = 'Task';
内容的提问来源于stack exchange,提问作者Lucian Sieberhagen
相关产品推荐
相关产品推荐

