2010-09-24 58 views
33

Estoy intentando ejecutar una consulta que tiene algunas columnas que son un tipo de datos CLOB. Si ejecuto la consulta como siempre, todos esos campos solo tienen (CLOB) como valor.Cómo consultar una columna CLOB en Oracle

He intentado utilizar DBMS_LOB.substr(column) y me sale el error

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

¿Cómo puedo consultar la columna CLOB?

+1

Estoy usando TOAD. – Catfish

+0

Normalmente, las herramientas de escritorio como Toad y PL/SQL Developer no intentan obtener una vista previa de las columnas CLOB, sino que muestran un marcador genérico '' en un cuadro de texto seleccionable que aparece en una ventana separada de Datos grandes al hacer clic en él. –

Respuesta

35

Al obtener la subcadena de una columna CLOB y el uso de una herramienta de consulta que tiene restricciones/Tamaño del búfer de veces que se necesita para establecer el BÚFER a un tamaño más grande. Por ejemplo, mientras que el uso de SQL Plus utilizar el SET BUFFER 10000 para establecerlo en 10000 como el valor predeterminado es 4000.

La ejecución del comando DBMS_LOB.substr también puede especificar la cantidad de caracteres que desea devolver y el desplazamiento desde cuál. Entonces, usar DBMS_LOB.substr(column, 3000) podría restringirlo a una cantidad lo suficientemente pequeña para el buffer.

Ver oracle documentation para obtener más información sobre el comando substr

 

    DBMS_LOB.SUBSTR (
     lob_loc  IN CLOB CHARACTER SET ANY_CS, 
     amount  IN INTEGER := 32767, 
     offset  IN INTEGER := 1) 
     RETURN VARCHAR2 CHARACTER SET lob_loc%CHARSET; 

+0

Configuré restringido a 3000 y funcionó. ¡Gracias! – Catfish

0

Si está utilizando SQL * Plus intenta lo siguiente ...

set long 8000 

select ... 
53

Esto funciona

select DBMS_LOB.substr(myColumn, 3000) from myTable 
0

Otra opción es crear una función y llamar a esa función cada vez que es necesario seleccionar la columna CLOB.

create or replace function clob_to_char_func 
(clob_column in CLOB, 
for_how_many_bytes in NUMBER, 
from_which_byte in NUMBER) 
return VARCHAR2 
is 
begin 
Return substrb(dbms_lob.substr(clob_column 
          ,for_how_many_bytes 
          ,from_which_byte) 
      ,1 
      ,for_how_many_bytes); 
end; 

y llamar a esa función como;

SELECT tocharvalue, clob_to_char_func(tocharvalue, 1, 9999) 
FROM (SELECT clob_column AS tocharvalue FROM table_name); 
2

para grandes CLOB selecciona también se puede utilizar:

SELECT dbms_lob.substr(column_name, dbms_lob.getlength(column_name), 1) FROM foo

3

Lo hice correr en otro estado, con HugeClob en mi base de datos Oracle. El dbms_lob.substr sólo se permite un valor de 4000 en la función, por ejemplo:

dbms_lob.substr(column,4000,1) 

así que para mi HughClob que era más grande, que tenía que usar dos llamadas en select:

select dbms_lob.substr(column,4000,1) part1, 
     dbms_lob.substr(column,4000,4001) part2 from ..... 

que estaba llamando desde una Aplicación Java, así que simplemente concatené part1 y part2 y lo envié como un correo electrónico.

+0

¿Cuál es la pregunta? – vulkanino

0

Para agregar a la respuesta.

declare 
v_result clob; 
begin 
---- some operation on v_result 
dbms_lob.substr(v_result, 4000 ,length(v_result) - 3999); 

end; 
/

En dbms_lob.substr

first parameter es clob que desea extraer.

Second parameter es la cantidad de trozos que desea extraer.

Third parameter es de la palabra que desea extraer.

En el ejemplo anterior, sé que mi tamaño de bloque es más de 50000, por lo que quiero los últimos 4000 caracteres.

Cuestiones relacionadas