salida procedimientos procedimiento parametros funciones español ejemplos ejecutar developer con almacenado 11g oracle plsql clob

oracle - procedimientos - ¿Cómo devolver la instancia temporal de CLOB de la función almacenada en Pl/SQL?



procedimientos y funciones oracle pl/sql (2)

Mi función almacenada crea una instancia de LOB temporal usando: Dbms_Lob.CreateTemporary(BUFFER, TRUE, Dbms_Lob.SESSION); donde BUFFER es una variable CLOB local. Después de eso, la función llena BUFFER con algunos datos y los devuelve.

El parámetro de duración de Dbms_Lob.CreateTemporary en mi caso es Dbms_Lob.SESSION , pero de acuerdo con la documentación de Dbms_Lob.SESSION :

El parámetro de duración pasado a dbms_lob.createtemporary () es una sugerencia . La duración del nuevo LOB temporal es la misma que la duración de la variable localizadora en PL / SQL. Por ejemplo, en el bloque de programa anterior, la variable de programa a tiene la duración de la trama residente. Por lo tanto, al final del bloque, la memoria de a se liberará al final de la función.

Por lo tanto, Oracle puede destruir BUFFER CLOB después de abandonar el bloque de funciones. Puedo ver que en algunos casos, cuando el BUFFER es más de 32K, no puedo leer su valor devuelto desde Java (JDBC).

¿Hay alguna otra forma de devolver la instancia temporal de CLOB de una función?


Creé la función para devolver un clob, con datos generados aleatoriamente, la longitud es de 200k caracteres.

create function f_clob return clob is l_clob CLOB := EMPTY_CLOB; l_len BINARY_INTEGER; l_content VARCHAR2(32000); BEGIN dbms_lob.createtemporary(l_clob, TRUE); dbms_lob.open(l_clob, dbms_lob.lob_readwrite); -- for i in 1..100 loop l_content := dbms_random.string(''A'', 2000); l_len := length(l_content); dbms_lob.writeappend(l_clob, l_len, l_content); end loop; dbms_lob.close(l_clob); -- return l_clob; end f_clob;

Luego llamo a la función:

select to_char(substr(f_clob, 1, 200)) clob_chunk from ( select 1 from dual union select 2 from dual)

Y siempre obtengo datos como resultado. Me pregunto por qué tu función no está devolviendo datos.


En un comentario, dijiste:

clob.getSubString(0, clob.length()) throws: java.sql.SQLException: Invalid argument(s) in call at oracle.sql.CLOB.getSubString(CLOB.java:236) mientras que clob.length() devuelve real longitud de mi clob

La documentación de getSubString establece que:

pos - el primer caracter de la subcadena a extraer. El primer personaje está en la posición 1.

Con una función simple para generar y devolver un CLOB, puedo recuperarlo a través de JDBC ( ojdbc5 o ojdbc6 ) sin problemas, ya sea con getCLOB() o getString() . Pero si trato de asignar el Oracle.sql.CLOB recuperado con getCLOB a una String usando

String x = getSubString(0, clob.length());

entonces también obtengo el Invalid argument(s) in call error de Invalid argument(s) in call . Solo cambiando eso a:

String x = getSubString(1, clob.length());

trabajos. Por lo tanto, parece que no tiene nada que ver con la asignación temporal en la función, o el tamaño CLOB. No entiendo por qué no tuviste un problema con los CLOB más pequeños. ¿Tal vez tu lógica no llegó a esto si fueran pequeños?

Mientras tanto, ha trabajado en esto con clob.getCharacterStream().read() , por lo que esto puede ser un poco irrelevante ahora.