Как вызвать JDBC функцию PL/SQL, которая возвращает UDO и интерпретирует этот результат?
скажем, мой 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 ответов
и решение
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");
.
Как насчет того, чтобы сделать вашу функцию таблица? Это позволит вам:
select CREATE_A_PERSON('Daniel') from dual;
и получить таблицу, состоящую из двух столбцов (возраст, имя) с данными текущего человека.