DB2 LUW触发器抛出异常报错:SQLCODE=-104语法错误排查
DB2 LUW触发器抛出异常报错SQLCODE=-104的解决方法
错误原因
你的触发器代码存在两个语法问题:
- SIGNAL不能嵌套在SELECT的CASE表达式中:CASE是用于返回值的表达式,无法承载SIGNAL这类流程控制语句,这直接导致了SQLCODE=-104的语法错误。
- SIGNAL的错误信息写法不正确:DB2中指定错误提示需要用
SET MESSAGE_TEXT子句,而非直接用括号包裹字符串。
修正后的触发器代码
CREATE OR REPLACE TRIGGER "TRG_ABC_DELETE_CHECK" NO CASCADE BEFORE DELETE ON ABC REFERENCING OLD AS OLD_OBJ FOR EACH ROW MODE DB2SQL BEGIN DECLARE v_exists INT; -- 查询是否存在满足条件的记录,仅取第一条 SELECT 1 INTO v_exists FROM ABC WHERE ID = 2 OR (NAME = 'AA' AND OLD_OBJ.TYPE = 2) FETCH FIRST 1 ROW ONLY; -- 如果存在符合条件的记录,抛出异常 IF v_exists = 1 THEN SIGNAL SQLSTATE '1234' SET MESSAGE_TEXT = 'Wrong Parameters'; END IF; END
额外说明
- 原WHERE子句中的逻辑
ID = 2 OR NAME = 'AA' AND OLD_OBJ.TYPE = 2因AND优先级高于OR,实际会被解析为ID = 2 OR (NAME = 'AA' AND OLD_OBJ.TYPE = 2),代码中已添加括号明确逻辑,避免歧义。 - 使用
FETCH FIRST 1 ROW ONLY可以避免查询返回多行导致的赋值错误,因为我们只需要判断是否存在符合条件的记录。
内容的提问来源于stack exchange,提问作者db2
相关产品推荐
相关产品推荐

