2010-09-24 155 views
33

Sto provando a eseguire una query che ha poche colonne che sono un tipo di dati CLOB. Se eseguo la query normalmente, tutti questi campi hanno solo il valore (CLOB).Come interrogare una colonna CLOB in Oracle

Ho provato ad utilizzare DBMS_LOB.substr(column) ed ottengo l'errore

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

come posso interrogare la colonna CLOB?

+1

Sto usando TOAD. – Catfish

+0

In genere gli strumenti desktop come Toad e PL/SQL Developer non tentano di visualizzare in anteprima le colonne CLOB, ma visualizzano invece un generico '' segnaposto in una casella di testo selezionabile che si apre in una finestra separata di dati grandi quando si fa clic. –

risposta

35

Quando si ottiene la stringa di una colonna CLOB e l'utilizzo di uno strumento di query che ha dimensioni restrizioni/tampone a volte si avrebbe bisogno di impostare la BUFFER ad una dimensione maggiore. Per esempio durante l'utilizzo di SQL più utilizzare il SET BUFFER 10000 per impostarlo a 10000 come il valore predefinito è 4000.

L'esecuzione del comando DBMS_LOB.substr è anche possibile specificare il numero di caratteri che si desidera tornare e l'offset da cui. Pertanto, l'utilizzo di DBMS_LOB.substr(column, 3000) potrebbe limitarlo a una quantità sufficientemente piccola per il buffer.

Vedi oracle documentation per maggiori informazioni sul 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

L'ho limitato a 3000 e ha funzionato. Grazie! – Catfish

0

Se si utilizza SQL * Plus tenta il seguente ...

set long 8000 

select ... 
53

Questo funziona

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

Un'altra opzione è quella di creare una funzione e chiamare tale funzione ogni volta che è necessario selezionare la colonna 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; 

e chiamare tale funzione come;

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

Per grandi CLOB seleziona anche può essere utilizzato:

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

3

ho incontrato un'altra condizione con HugeClob nel mio database Oracle. L'dbms_lob.substr ammessi solo un valore di 4000 nella funzione, es:

dbms_lob.substr(column,4000,1) 

così per il mio HughClob che era più grande, ho dovuto usare due chiamate in select:

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

stavo chiamando da un App Java quindi ho semplicemente concatenato part1 e part2 e inviato come email.

+0

Qual è la domanda? – vulkanino

0

Per aggiungere alla risposta.

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

end; 
/

In dbms_lob.substr

first parameter è clob che si desidera estrarre.

Second parameter indica la lunghezza del clob da estrarre.

Third parameter è da quale parola si desidera estrarre.

Nell'esempio precedente so che la dimensione del mio clob è superiore a 50000, quindi voglio gli ultimi 4000 caratteri.

Problemi correlati