You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DB2 LUW触发器抛出异常报错:SQLCODE=-104语法错误排查

DB2 LUW触发器抛出异常报错SQLCODE=-104的解决方法

错误原因

你的触发器代码存在两个语法问题:

  1. SIGNAL不能嵌套在SELECT的CASE表达式中:CASE是用于返回值的表达式,无法承载SIGNAL这类流程控制语句,这直接导致了SQLCODE=-104的语法错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:20:22