2011-11-27 11 views
6

decir que mi UDO (objeto de usuario definido) es:¿Cómo llamo por JDBC una función PL/SQL que devuelve un UDO e interpreta ese resultado?

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

Y tengo una función 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; 

Probé el siguiente método y funciona, y hay maneras de 'PARSE 'el resultado

... 

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()); 
} 

... 

Pero lo que yo quiero usar es un CallableStatement como:

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); 

... 

Así que este último fragmento de código arroja diferentes tipos de excepción dependiendo del java.sql.Type que uso, el tipo de método de ejecución.

¿Alguien? Busqué en los documentos de Oracle, pero me resulta muy confuso.

+0

Cuando el sistema lo permita (creo que son las primeras 8 horas después de haber publicado la pregunta), elimine la respuesta de su pregunta y vuelva a publicarla como una respuesta real. – BalusC

Respuesta

6

Así que la solución es

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(); 
... 

línea antigua:

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

Nueva línea:

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

desde aquí se acaba 'de análisis' el objeto java.sql.Struct. Lo mismo ocurre con las colecciones (solo he probado VARRAY_OF_NUM) necesita usar el registerOutParameter con tres parámetros, de lo contrario verá algunas excepciones como "ORA-03115: tipo de datos o representación de red no compatible". Obviamente, si su función PL/SQL devuelve un VARRAY, use statement.registerOutParameter(1, OracleTypes.ARRAY, "YOURE_VARRAY_TYPE");.

0

¿Qué le parece hacer de su función una función table? Esto le permitirá:

select CREATE_A_PERSON('Daniel') from dual; 

y recibir una tabla que consta de dos columnas (edad, nombre) con los detalles de la persona actual.

+0

no es lo que estoy buscando ... encontré la solución, pero aún no puedo publicar las respuestas a mi pregunta –

Cuestiones relacionadas