【问题标题】:JDBC Call to a stored procedure returns null对存储过程的 JDBC 调用返回 null
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2020-01-21
    • 2015-05-28
    • 2013-07-24
    • 2020-08-03
    相关资源
    最近更新 更多