web-dev-qa-db-fra.com

Comment interroger une colonne CLOB dans Oracle

J'essaie d'exécuter une requête qui a quelques colonnes qui sont un type de données CLOB. Si je lance la requête comme d'habitude, tous ces champs ont simplement (CLOB) comme valeur.

J'ai essayé d'utiliser DBMS_LOB.substr(column) et j'obtiens l'erreur 

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

Comment interroger la colonne CLOB?

37
Catfish

Lors de l'extraction de la sous-chaîne d'une colonne CLOB et de l'utilisation d'un outil de requête comportant des restrictions de taille/tampon, il est parfois nécessaire de définir le paramètre BUFFER sur une taille supérieure. Par exemple, lorsque vous utilisez SQL Plus, utilisez le SET BUFFER 10000 pour le définir sur 10 000 comme valeur par défaut est 4 000.

En exécutant la commande DBMS_LOB.substr, vous pouvez également spécifier le nombre de caractères à renvoyer et le décalage à partir duquel. Donc, utiliser DBMS_LOB.substr(column, 3000) pourrait le limiter à une quantité suffisamment petite pour le tampon.

Voir Documentation Oracle pour plus d’informations sur la commande substr


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

38
mrjohn

Cela marche

select DBMS_LOB.substr(myColumn, 3000) from myTable
62
Chris

J'ai rencontré un autre problème avec HugeClob dans ma base de données Oracle. Le dbms_lob.substr n'autorisait qu'une valeur de 4000 dans la fonction, par exemple:

dbms_lob.substr(column,4000,1)

donc pour mon HughClob qui était plus grand, je devais utiliser deux appels dans select:

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

J'appelais depuis une application Java, j'ai donc simplement concaténé part1 et part2 et envoyé sous forme de courrier électronique.

7
Cliff Bender

Une autre option consiste à créer une fonction et à l'appeler à chaque fois que vous devez sélectionner une colonne d'objet. 

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;

et appelez cette fonction comme;

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