我的应用程序中有很多存储过程调用,我们正在使用可调用语句。有时我们需要调试传递给存储过程的参数,没有简单的方法,只能编写代码打印来自实体对象的所有值。
因此,我试图创建一个通用函数,该函数将接收可调用语句签名、执行后的可调用语句对象以及已执行并打印在日志中以进行调试的 SQL。我编写了以下代码,但它在 switch case 1 的 cs.getString 上抛出了 sql 异常“参数类型无效”。
这里的参数类型是从 cs 元数据中检索到的 1,根据javadoc,常量 1 用于 CHAR,它应该映射到 java 中的字符串。甚至我为这个存储过程设置的实际参数也使用了 String,它工作得很好,那么为什么 getString 会因为这个异常而失败呢?
我正在使用 AS400 驱动程序。
StringBuffer sb = new StringBuffer("{ call ").append(storProcName)
.append(" (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) }");
cs = connection.prepareCall(sb.toString());
// Get and set all parameters
cs.executeUpdate();
ParameterMetaData paramd = cs.getParameterMetaData();
int index, type;
for (int i = 1; i < paramd.getParameterCount(); i++) {
type = paramd.getParameterType(i);
index = sb.indexOf("?");
if (paramd.getParameterMode(i) == ParameterMetaData.parameterModeIn) {
switch (type) {
case 1:
sb = sb.replace(index, index + 1, "'" + cs.getString(i)
+ "'");
break;
}
}
}