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