JDBC Вызов хранимой процедуры возвращает ноль - PullRequest
4 голосов
/ 12 января 2012

У меня есть некоторые проблемы с хранимой процедурой в базе данных 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: недопустимый символ)

Не могли бы вы мне помочь?

1018 * Fab *


Вот решение:

2 последних параметра процедуры - IN OUT. Я думал, что мы должны управлять ими как выходной параметр:

CallableStatement call = connection.prepareCall("{?, ? = call bksgnvcrm.createorreturnproduct1nc(..., ?, ?)}");

Но так как они ВНЕ, эти параметры должны быть объявлены как В:

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);

Надеюсь, это поможет вам:)

1 Ответ

5 голосов
/ 17 марта 2014

У меня тоже была такая же проблема.В моем случае я понял, что забыл слово «call» при вызове хранимой процедуры.

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

Это может помочь кому-то еще, кто знает ...

...