Как мне вызвать JDBC функцию PL / SQL, которая возвращает UDO и интерпретирует этот результат? - PullRequest
6 голосов
/ 27 ноября 2011

Скажите, что мой UDO (пользовательский объект):

create or replace
TYPE UDO_PERSON AS object (NAME VARCHAR2(100), AGE INTEGER);

И у меня есть функция PL / SQL

create or replace
FUNCTION CREATE_A_PERSON(NAME VARCHAR2)
RETURN UDO_PERSON
AS  
    AGE INTEGER;
BEGIN

    SELECT dbms_random.value(1,100) INTO AGE FROM DUAL;
    RETURN NEW UDO_PERSON(NAME, AGE);

END CREATE_A_PERSON;

Я протестировал следующий метод, и он работает, и тамспособы "разбора" результата

...

String select = "SELECT CREATE_A_PERSON('my name') FROM DUAL";
Statement stmt=conn.createStatement();
ResultSet rs= stmt.executeQuery(select);
rs.next();

java.sql.Struct jdbcStruct = (java.sql.Struct)rs.getObject(1);

Object[] attrs = jdbcStruct.getAttributes();
for(int i=0;i<attrs.length;i++){
    System.out.println("attrs["+i+"] "+attrs[i].toString());
}

... 

Но я хочу использовать CallableStatement вроде:

String procedure = "{? = call CREATE_A_PERSON (?)}";
CallableStatement statement = conn.prepareCall(procedure);

statement.registerOutParameter(1, java.sql.Types.STRUCT); // I tested with OTHER, JAVA_OBJECT 
statement.setString(2, "Youre name");

ResultSet rs= statement.executeQuery(); // tried also with execute() and then statement.getObject()...still nothing
java.sql.Struct jdbcStruct = (java.sql.Struct)rs.getObject(1);

...

Так что этот последний фрагмент кода вызывает различные виды исключенийв зависимости от java.sql.Type, который я использую, от типа метода execute.

Кто-нибудь?Я искал документы Oracle, но меня это очень смущает.

Ответы [ 2 ]

6 голосов
/ 28 ноября 2011

Итак, решение

String procedure = "{? = call CREATE_A_PERSON (?)}";
CallableStatement statement = conn.prepareCall(procedure);
statement.registerOutParameter(1, java.sql.Types.STRUCT, "UDO_PERSON");
statement.setString(2, "YOURE NAME");
statement.execute();
...

Старая строка:

statement.registerOutParameter(1, java.sql.Types.STRUCT);

Новая строка:

statement.registerOutParameter(1, java.sql.Types.STRUCT, "UDO_PERSON");

отсюда вы просто 'разбираете' объект java.sql.Struct. То же самое относится и к коллекциям (хотя я тестировал только VARRAY_OF_NUM), вам нужно использовать registerOutParameter с тремя параметрами, иначе вы увидите некоторые исключения, такие как «ORA-03115: неподдерживаемый тип данных или представление сети». Очевидно, что если ваша PL / SQL-функция возвращает VARRAY, используйте statement.registerOutParameter(1, OracleTypes.ARRAY, "YOURE_VARRAY_TYPE");.

0 голосов
/ 27 ноября 2011

Как насчет того, чтобы сделать вашу функцию функцией table ?Это позволит вам:

select CREATE_A_PERSON('Daniel') from dual;

и получить таблицу, состоящую из двух столбцов (ВОЗРАСТ, ИМЯ) с данными текущего человека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...