Oracle PL/SQL复合触发器中CASE WHEN变量赋值报错问题咨询
Oracle PL/SQL复合触发器CASE WHEN赋值错误解决方法
你的实现方式不正确,问题出在你在SQL查询语句中直接写入了PL/SQL的赋值操作(:=),这违反了SQL语法规则:SQL中的CASE WHEN仅用于返回值,不能在分支中执行PL/SQL的变量赋值逻辑。
正确实现方式
方式一:直接使用PL/SQL CASE语句赋值(推荐)
无需借助SELECT ... FROM dual,直接在PL/SQL逻辑中完成判断与赋值:
-- 查询获取contractEnd变量值 SELECT contract_end INTO contractEnd FROM contract WHERE contract_id = :new.expense_job; -- 通过PL/SQL CASE语句直接赋值 contractIDCollection(iterator).ended := CASE WHEN contractEnd IS NOT NULL THEN 1 ELSE 0 END;
方式二:SQL查询赋值(符合语法但不推荐)
如果坚持用SQL查询的方式,需要将CASE返回的值通过INTO子句赋值给目标变量,而非在CASE分支内写赋值操作:
SELECT CASE WHEN contractEnd IS NOT NULL THEN 1 ELSE 0 END INTO contractIDCollection(iterator).ended FROM dual;
错误原因说明
原代码中,你将PL/SQL的赋值语句contractIDCollection(iterator).ended := 1写在了SQL的CASE分支里,Oracle SQL解析器无法识别:=这个PL/SQL专属的赋值操作符,因此抛出ORA-00905: missing keyword错误,同时上层的SQL语句也被忽略。
内容的提问来源于stack exchange,提问作者Joe Moore
相关产品推荐
相关产品推荐

