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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:48:24