DB2中运行多个CALL语句遇SQLCODE=-313报错,求解决方法
解决DB2复合语句中调用SYSPROC.SYSTS_CREATE的SQLCODE=-313错误
问题原因
在复合SQL块(BEGIN/END)中,每个CALL SYSPROC.SYSTS_CREATE的最后一个参数是输出参数(?),当前写法未为这两个输出参数声明对应变量,导致DB2无法匹配参数数量,触发SQLCODE=-313错误。单独执行时工具会自动处理单个输出参数,但复合块需要显式声明变量。
DBeaver测试时的修正写法
先声明两个变量接收每个CALL的输出结果,示例如下:
BEGIN DECLARE v_msg1 VARCHAR(1024); DECLARE v_msg2 VARCHAR(1024); CALL SYSPROC.SYSTS_CREATE('my_schema', 'my_index', 'my_schema.my_table (column1)', '', 'en_us', v_msg1); CALL SYSPROC.SYSTS_CREATE('my_schema', 'my_index_column2', 'my_schema.my_table (column2)', '', 'en_us', v_msg2); -- 可选:输出返回信息 SELECT v_msg1 AS msg1, v_msg2 AS msg2 FROM SYSIBM.SYSDUMMY1; END;
注意:两次调用不能使用同名索引,示例中已修改第二个索引名为my_index_column2,避免创建重复索引报错
C#中作为单条命令运行的写法
需要为两个输出参数分别定义DbParameter并设置参数方向为输出,示例代码如下:
string sql = @" BEGIN CALL SYSPROC.SYSTS_CREATE('my_schema', 'my_index', 'my_schema.my_table (column1)', '', 'en_us', ?); CALL SYSPROC.SYSTS_CREATE('my_schema', 'my_index_column2', 'my_schema.my_table (column2)', '', 'en_us', ?); END;"; using (IBM.Data.DB2.DB2Connection conn = new IBM.Data.DB2.DB2Connection(yourConnectionString)) { conn.Open(); using (IBM.Data.DB2.DB2Command cmd = conn.CreateCommand()) { cmd.CommandText = sql; // 添加第一个输出参数 var param1 = cmd.CreateParameter(); param1.DbType = DbType.String; param1.Direction = ParameterDirection.Output; param1.Size = 1024; cmd.Parameters.Add(param1); // 添加第二个输出参数 var param2 = cmd.CreateParameter(); param2.DbType = DbType.String; param2.Direction = ParameterDirection.Output; param2.Size = 1024; cmd.Parameters.Add(param2); cmd.ExecuteNonQuery(); // 获取输出结果 string msg1 = param1.Value.ToString(); string msg2 = param2.Value.ToString(); } }
内容的提问来源于stack exchange,提问作者mxcolin
相关产品推荐
相关产品推荐

