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 queclob.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.