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);
これがあなたの助けになることを願っています:)