gpt4 book ai didi

stored-procedures - 对存储过程的 JDBC 调用返回 null

转载 作者:行者123 更新时间:2023-12-04 07:43:11 24 4
gpt4 key购买 nike

我在 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: invalid character)

你可以帮帮我吗 ?

晶圆厂

这是解决方案:

该过程的最后两个参数是 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);

我希望这可以帮助你:)

最佳答案

我也有同样的问题。就我而言,我意识到我在调用存储过程时忘记了“调用”这个词。

"{ call myPackage.myProcedure(?,?,?,?) }"

这可能有一天会帮助其他人,谁知道...

关于stored-procedures - 对存储过程的 JDBC 调用返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8837901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com