DB2动态SQL插入字符串报错SQL0103 SQLSTATE=42604问题求助
DB2动态SQL插入字符串报SQL0103错误解决方案
错误根因
SQL0103报错的核心原因是动态SQL拼接时没有给字符串类型的插入值包裹单引号:
SQL0103 The numeric literal "00XAB" is not valid SQLSTATE = 42604
你要插入的字符串'7000,21,00XYZ, ABC'开头是数字字符,DB2解析没有加引号的内容时,会优先判定为数字字面量,遇到后续的非数字字符X就会触发非法数字字面量的报错。
你使用静态语法INSERT INTO TABLE_NAME1(COLUMN1) (SELECT statement)执行时,已经正确给字符串加了单引号,数据库能正确识别为字符串类型,所以不会报错。
修复方案
- 方案1:使用参数化动态SQL(最推荐,同时可防范SQL注入风险)
不要直接把值拼接到动态SQL语句中,改用参数占位符,执行时绑定字符串参数即可。示例语法:-- 存储过程内动态SQL参考写法 DECLARE v_sql VARCHAR(1000); DECLARE v_col_val VARCHAR(100) DEFAULT '7000,21,00XYZ, ABC'; SET v_sql = 'INSERT INTO TABLE_NAME1(COLUMN1) VALUES (?)'; PREPARE stmt FROM v_sql; EXECUTE stmt USING v_col_val; - 方案2:拼接SQL时主动转义并包裹单引号
如果业务逻辑要求必须直接拼接值,需要给字符串值前后加单引号,同时要把值内部本身存在的单引号替换为两个单引号完成转义:
拼接完成后的完整SQL中,你的目标字符串会被正确包裹为SET v_sql = 'INSERT INTO TABLE_NAME1(COLUMN1) VALUES (''' || REPLACE(v_col_val, '''', '''''') || ''')';'7000,21,00XYZ, ABC'格式,数据库即可正常解析。
内容的提问来源于stack exchange,提问作者sagar badiger
相关产品推荐
相关产品推荐

