我的应用程序中有很多存储过程调用,我们使用可调用语句。有时我们需要调试传递给存储过程的参数,没有简单的方法可以写代码打印来自实体对象的所有值。
所以我试图创建一个泛型函数,它将接受可调用语句签名,执行后的可调用语句对象以及执行的SQL并在日志中打印以进行调试。我编写了以下代码,但它在switch case 1的cs.getString上抛出sql异常“Parameter type not valid”。
这里参数类型是从cs元数据中检索到的1,并且根据javadoc,常量1用于CHAR,它应该映射到java中的字符串。甚至我对这个存储过程的实际set参数也使用了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;
}
}
}
答案 0 :(得分:3)
在上面的示例中,只能在输出参数上调用getString()方法。
您是否尝试过使用驱动程序的跟踪功能来显示参数值?如果您使用的是工具箱驱动程序,可以在此处找到有关跟踪的信息:
http://www-01.ibm.com/support/docview.wss?uid=nas8N1018744
如果您使用的是本机JDBC驱动程序,可以在此处找到有关跟踪的信息: http://www-01.ibm.com/support/docview.wss?uid=nas8N1019479