hibernate - 我正在尝试调用 db2 过程,但出现运行时错误 com.ibm.db2.jcc.am.SqlSyntaxErrorException
问题描述
我正在调用 db2 过程,但出现运行时错误`
“com.ibm.db2.jcc.am.SqlSyntaxErrorException”
`.此运行时错误表示存在语法错误,但我无法弄清楚我的代码到底出了什么问题。有人可以帮帮我吗?
public String getReferenceno(String Product_Code) throws SQLException
{
String reference_no=null;
CallableStatement callableStatement;
try {
System.out.println(Product_Code);
//callableStatement = connection_new().prepareCall("CALL IPS_DB.GET_SEQUENCE_NUMBER(?,?)");
callableStatement = connection_new().prepareCall("{Call IPS_DB.GET_SEQUENCE_NUMBER(?,?)}");
callableStatement.setString(1, Product_Code);
callableStatement.registerOutParameter(2, Types.VARCHAR);
callableStatement.execute();
//reference_no = (String) callableStatement.getString(2);
connection_new().close();
} catch (SQLException e) {
e.printStackTrace();
return "error";
}
return reference_no ;
}
解决方案
IPS_DB.GET_SEQUENCE_NUMBER
我认为查看过程的定义和返回的确切 SQLCODE会很有用。
例如,如果我CALL MYSP(...)
使用不正确数量(或不兼容)的参数执行,那么com.ibm.db2.jcc.am.SqlSyntaxErrorException
也会被抛出:
DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=MULTIPLY_BY_THREE;PROCEDURE, DRIVER=3.72.52
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=MULTIPLY_BY_THREE;PROCEDURE, DRIVER=3.72.52
at com.ibm.db2.jcc.am.b1.a(b1.java:813)
at com.ibm.db2.jcc.am.b1.a(b1.java:66)
at com.ibm.db2.jcc.am.b1.a(b1.java:140)
at com.ibm.db2.jcc.am.kj.c(kj.java:2790)
at com.ibm.db2.jcc.am.kj.d(kj.java:2778)
at com.ibm.db2.jcc.am.kj.a(kj.java:2222)
at com.ibm.db2.jcc.am.kk.a(kk.java:7643)
at com.ibm.db2.jcc.t4.ab.i(ab.java:148)
at com.ibm.db2.jcc.t4.ab.e(ab.java:77)
at com.ibm.db2.jcc.t4.p.d(p.java:63)
at com.ibm.db2.jcc.t4.av.m(av.java:185)
at com.ibm.db2.jcc.am.kj.ak(kj.java:2217)
at com.ibm.db2.jcc.am.kk.bn(kk.java:3602)
at com.ibm.db2.jcc.am.kk.a(kk.java:4460)
at com.ibm.db2.jcc.am.CallableStatement.b(CallableStatement.java:128)
at com.ibm.db2.jcc.am.CallableStatement.a(CallableStatement.java:103)
at com.ibm.db2.jcc.am.CallableStatement.execute(CallableStatement.java:93)
从 SQLCODE 我可以了解到没有找到匹配的例程:
db2 ? sqln440
SQL0440N No authorized routine named "<routine-name>" of type
"<routine-type>" having compatible arguments was found.
这意味着代码本身是可以的。
这是一个CallableStatement
执行的工作示例:
- SP定义:
db2 "create or replace procedure multiply_by_two(in input int, out output int)
language sql
set output = input*2"
- 代码:
import java.sql.*;
import java.util.*;
import com.ibm.db2.jcc.*;
public class so
{
public static void main(String [] args)
{
String url;
CallableStatement cstmt;
Connection c;
Properties props = new Properties();
if (args.length != 5)
{
System.out.println("USAGE: java so db_name hostname portnum username password");
return;
}
url = "jdbc:db2://"+args[1]+":"+args[2]+"/" + args[0];
try
{
Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();
props.put("user",args[3]);
props.put("password",args[4]);
c = DriverManager.getConnection(url,props);
cstmt = c.prepareCall("CALL MULTIPLY_BY_TWO(?,?)");
cstmt.setInt(1,10);
cstmt.registerOutParameter(2, Types.INTEGER);
cstmt.execute();
int out = cstmt.getInt(2);
System.out.println("MULTIPLY_BY_TWO returned: " + out);
cstmt.close();
}
catch (Exception e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("Execution complete.");
}
}
- 汇编:
~/sqllib/java/jdk64/bin/javac so.java
- 执行:
~/sqllib/java/jdk64/bin/java so sample localhost 60111 db2v111 passw0rd
MULTIPLY_BY_TWO returned: 20
Execution complete.
推荐阅读
- swift - 如何克服“函数签名中未使用通用参数'T'”的错误?
- javascript - JavaScript:滚动到 DIV 中的某个部分使页面跳转和其他滚动未按预期工作
- dart - 在 InputDecoration() 颤动中将 labelText 方向更改为 RTL
- javascript - 如何将元素绑定到 React 中的模态?
- mongodb - 将新事件保存到数据库
- spring - 在 spring PropertyPlaceHolderConfigurer 中无法加载属性错误
- javascript - 访问数组中的 JavaScript 对象
- python - 用于数据增强的灰度图像阵列旋转
- python - Python类声明“位置参数”错误
- xml - Googlescript 解析 XML 时出现问题