DB2中创建支持全数据类型的UPDATE存储过程报错求助
DB2存储过程更新DataTypes表的正确实现
错误原因
错误SQLCODE=-206是因为你在UPDATE语句中用update_3.smallint_1这种方式引用存储过程参数,DB2不支持该语法;同时参数名和表列名完全一致,导致数据库无法区分你引用的是参数还是表列。
修正方案
给存储过程的输入参数添加前缀(比如p_),避免和表列名冲突,直接使用参数名赋值即可。另外,若要更新所有记录,需去掉WHERE子句;若按integer_1条件更新,则保留WHERE子句并注意区分参数与列。
正确的存储过程代码(按integer_1条件更新)
@delimiter %%%; CREATE OR REPLACE PROCEDURE "DB2INST1"."update_3" ( IN p_smallint_1 SMALLINT, IN p_integer_1 INTEGER, IN p_bigint_1 BIGINT, IN p_float_1 FLOAT, IN p_decimal_1 DECIMAL, IN p_varchar_1 VARCHAR(50), IN p_char_1 CHAR(20), IN p_boolean_1 BOOLEAN, IN p_date_1 DATE, IN p_time_1 TIME, IN p_timestamp_1 TIMESTAMP, IN p_real_1 REAL, IN p_double_1 DOUBLE, IN p_clob_1 CLOB(5M), IN p_blob_1 BLOB(5M) ) SPECIFIC update_3 LANGUAGE SQL DYNAMIC RESULT SETS 0 -- 无返回结果集,设为0更合理 BEGIN UPDATE datatypes SET smallint_1 = p_smallint_1, bigint_1 = p_bigint_1, float_1 = p_float_1, decimal_1 = p_decimal_1, varchar_1 = p_varchar_1, char_1 = p_char_1, boolean_1 = p_boolean_1, date_1 = p_date_1, time_1 = p_time_1, timestamp_1 = p_timestamp_1, real_1 = p_real_1, double_1 = p_double_1, clob_1 = p_clob_1, blob_1 = p_blob_1 WHERE integer_1 = p_integer_1; -- 按integer_1条件筛选更新 END;%%% @delimiter;%%%
如果需要更新所有记录(去掉WHERE子句)
将上述UPDATE语句中的WHERE integer_1 = p_integer_1;删除即可,修改后的UPDATE部分如下:
UPDATE datatypes SET smallint_1 = p_smallint_1, bigint_1 = p_bigint_1, float_1 = p_float_1, decimal_1 = p_decimal_1, varchar_1 = p_varchar_1, char_1 = p_char_1, boolean_1 = p_boolean_1, date_1 = p_date_1, time_1 = p_time_1, timestamp_1 = p_timestamp_1, real_1 = p_real_1, double_1 = p_double_1, clob_1 = p_clob_1, blob_1 = p_blob_1;
关键说明
- 参数添加
p_前缀,彻底避免与表列名的命名冲突,让数据库明确识别引用的是输入参数。 DYNAMIC RESULT SETS设为0,因为该存储过程仅执行更新操作,无需返回结果集。- 若更新全表,务必确认业务需求,避免误操作导致全表数据变更。
内容的提问来源于stack exchange,提问作者sujay777
相关产品推荐
相关产品推荐

