DB2大型机V12触发器创建失败(SQLCODE=-104)求助
解决DB2大型机V12触发器创建时的SQLCODE -104错误
问题原因分析
SQLCODE -104表示存在非法符号或语法不符合DB2 z/OS规范,你的代码主要有以下几个问题:
- 字符串常量使用了中文全角单引号(
‘0’),DB2仅识别英文半角单引号('0')。 - 未明确指定触发器的SQL模式
MODE DB2SQL,DB2 z/OS的触发器需要该关键字启用SQL过程语法支持。 - 第一个触发器中的
FETCH First 1 rows only语法错误,DB2标准语法为FETCH FIRST 1 ROW ONLY(ROW需为单数形式)。
修正后的触发器代码
触发器1(通过field1匹配并取首行)
CREATE TRIGGER GENTRIGG NO CASCADE BEFORE INSERT ON Table1 REFERENCING NEW AS NNN FOR EACH ROW MODE DB2SQL BEGIN ATOMIC SELECT Table2.field2 INTO NNN.field2 FROM Table2 WHERE Table2.field1 = NNN.field1 FETCH FIRST 1 ROW ONLY; END
触发器2(通过field1+field3='0'匹配,确保单行返回)
CREATE TRIGGER GENTRIGG NO CASCADE BEFORE INSERT ON Table1 REFERENCING NEW AS NNN FOR EACH ROW MODE DB2SQL BEGIN ATOMIC SELECT Table2.field2 INTO NNN.field2 FROM Table2 WHERE Table2.field1 = NNN.field1 AND Table2.field3 = '0'; END
关键说明
MODE DB2SQL:必须指定该关键字,告知DB2使用SQL过程语言解析触发器体,避免语法解析错误。BEGIN ATOMIC:确保触发器体内的SQL语句作为原子执行单元,符合DB2 z/OS触发器的过程块要求。- 英文半角引号:所有字符串常量必须使用
'而非中文引号,这是引发-104错误的常见原因之一。 FETCH FIRST 1 ROW ONLY:正确的单行限制语法,DB2不支持复数形式的rows。
内容的提问来源于stack exchange,提问作者just Dev
相关产品推荐
相关产品推荐

