Получение неожиданного значения NULL из параметра OUT вызываемого оператора - PullRequest
1 голос
/ 05 января 2012

У меня есть две процедуры: хранимая процедура Java JAVA_P (), которая связана со статическим методом O.execute (), и процедура pl / sql SQL_P (in_param IN CUSTOM_TYPE_1, out_param OUT CUSTOM_TYPE_2).

JAVA_P вызывает SQL_P с CallableStatement.

А теперь большой WTF: когда я запускаю O.execute () за пределами оракула (из внешнего jvm), получаемый out_param устанавливается, как и ожидалось.Когда я запускаю O.execute () как JAVA_P () (используя встроенную в jvm утилиту oracle), для out_param устанавливается значение null (SQL_P выполняется без исключения и должен быть установлен выходной параметр).

У вас есть какие-либоидеи, почему это происходит?

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - версия JRE 64bi, используемая для тестов 1.4.2_04.JDBC версия 10.2.0.3.0

@ Юрген Хартельт: Мой английский может быть недостаточно хорош, чтобы объяснить это ясно, но я попробую так:

1) я написал некоторый код Java, используя какобычно моя IDE:

public class P141_JAVABridge
{
   public static void execute()
   {
        String databaseDriver = "oracle.jdbc.driver.OracleDriver";
        String databaseUrl = "jdbc:oracle:thin:@xxx:1521:orcl";
        String databaseUsername = "xxx";
        String databasePassword = "xxx";

        ods.setDriverType(databaseDriver);
        ods.setURL(databaseUrl);
        ods.setUser(databaseUsername);
        ods.setPassword(databasePassword);

        connection = ods.getConnection();


        .... some code

        map.put("custom_T",Custom_T_SQLData.class);

        CallableStatement call = connection.prepareCall("call P141(?,?)");

        call.setObject(1,inputObjectReference);
        call.registerOutParameter(2,OracleTypes.STRUCT,"custom_T");
        call.execute();

        .... some code

   }
}

2) я запускаю этот код - вау!это работает

3) я изменил

connection = ods.getConnection();

на

connection = DriverManager.getConnection("jdbc:default:connection:");

4) скомпилировать и загрузить класс в Oracle

5) у меня естьсвязал P141_JAVABridge.execute () с P141_JB

create or replace PROCEDURE P141_JB () IS LANGUAGE JAVA NAME 'x.y.z.P141_JAVABridge.execute()';

6), затем я выполнил P141_JB

SET SERVEROUTPUT ON;
BEGIN

   ...some code

   P141_JB();

   ...some code

END;

и получил исключение NullPointerException при

((Custom_T_SQLData)call.getObject(2)).responseStatus

1 Ответ

0 голосов
/ 07 января 2012

Я сделал так, как Плата за проезд сообщил мне, и я поставил «вызов P141 (?,?)» В фигурные скобки:

"{call P141(?,?)}"

ТАДА!Это работает.

...