4

Oracle データベースのストアド プロシージャに問題があります。

プロシージャー (50 の IN パラメーターと 2 つの IN OUT パラメーターを持つ) を呼び出して、これらの 2 つの OUT パラメーターを取得したいだけです。

関連する CallableStatement を execute() しようとしていますが、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: 無効な文字)

私たちを手伝ってくれますか ?

ファブ


解決策は次のとおりです。

プロシージャの最後の 2 つのパラメータは 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);

これがあなたの助けになることを願っています:)

4

1 に答える 1

5

私も同じ問題を抱えていました。私の場合、ストアド プロシージャを呼び出すときに「call」という単語を忘れていたことに気付きました。

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

これは、いつか知っている他の誰かを助けるかもしれません...

于 2014-03-17T02:44:31.813 に答える