【发布时间】:2012-02-08 21:48:23
【问题描述】:
我在 Oracle 数据库上的存储过程遇到了一些问题。
我只想调用一个过程(它有50个IN参数和2个IN OUT参数)并获取这2个OUT参数。
我正在尝试执行()相关的 CallableStatement,但它返回一个 NullPointerException
java.lang.NullPointerException
at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:977)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1363)
...
这是代码(我使用的是 Hibernate):
Session session = (Session) HibernateUtil.currentSession();
final Transaction transaction = session.beginTransaction();
try {
session.doWork(new Work() {
public void execute(Connection connection) throws SQLException {
try {
CallableStatement call = connection.prepareCall("{?,? = call geneva_admin.bksgnvcrmps.createorreturnproduct1nc(" +
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," +
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?," +
"?,?,?,?,?,?,?,?,?,?,?,?)}");
int i = 1;
call.registerOutParameter(i++, Types.INTEGER);
call.registerOutParameter(i++, Types.VARCHAR);
call.setString(i++, typeofproduct);
call.setString(i++, shiptositenumber);
call.setString(i++, billtositenumber);
call.setString(i++, ordernumber);
call.setInt(i++, orderid);
...
call.setInt(i++, errcode);
call.setString(i++, errmsg);
call.execute();
System.out.println("err_code: " + call.getString(1));
System.out.println("err_msg: " + call.getString(2));
call.close();
transaction.commit();
} catch (SQLException e) {
throw new SQLException(e);
}
}
});
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
return false;
}
如果在execute()之前,我设置了
call.setEscapeProcessing(false);
我遇到了 SQLSyntaxErrorException(ORA-00911:无效字符)
你能帮我吗?
工厂
解决方法如下:
过程的最后两个参数是 IN OUT。 我认为我们必须将它们作为 OUT 参数进行管理:
CallableStatement call = connection.prepareCall("{?, ? = call bksgnvcrm.createorreturnproduct1nc(..., ?, ?)}");
但由于它们是 IN OUT,所以这些参数必须声明为 IN :
CallableStatement call = connection.prepareCall("{call bksgnvcrm.createorreturnproduct1nc(..., ?, ?)}");
最后像这样将它们注册为 OUT:
call.registerOutParameter(i, Types.INTEGER);
call.setInt(i++, errcode);
call.registerOutParameter(i, Types.VARCHAR);
call.setString(i++, errmsg);
希望对你有帮助:)
【问题讨论】:
-
{?, ? = 呼叫 bksgnvcrm - 那是什么?您不能从函数调用中返回两个结果。
标签: stored-procedures jdbc ora-00911 callable-statement