Comment interroger une colonne CLOB dans Oracle

j'essaye d'exécuter une requête qui a quelques colonnes qui sont un type de données CLOB. Si j'exécute la requête comme d'habitude, tous ces domaines ont juste (CLOB) en tant que valeur.

j'ai essayé en utilisant DBMS_LOB.substr(column) et j'ai l'erreur

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

Comment puis-je interroger la colonne CLOB?

34
demandé sur Topera 2010-09-24 23:35:43

7 réponses

lors de l'obtention de la sous-couche d'une colonne CLOB et de l'utilisation d'un outil de requête qui a des restrictions de taille/tampon, parfois vous auriez besoin de mettre le tampon à une plus grande taille. Par exemple, en utilisant SQL Plus utilisez le SET BUFFER 10000 mettre à 10000 par défaut est de 4000.

Exécution DBMS_LOB.substr commande vous pouvez également spécifier le nombre de caractères que vous souhaitez retourner et le décalage entre ce qui. Donc, en utilisant DBMS_LOB.substr(column, 3000) pourrait restreindre à un assez petit montant pour l' tampon.

Voir documentation oracle pour plus d'informations sur la commande 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;

36
répondu mrjohn 2016-10-22 13:10:24

Cela fonctionne

select DBMS_LOB.substr(myColumn, 3000) from myTable
58
répondu Chris 2010-11-17 01:24:20

J'ai rencontré un autre problème avec HugeClob dans ma base de données Oracle. dbms_lob.substr seulement permis une valeur de 4000 dans la fonction, ex:

dbms_lob.substr(column,4000,1)

donc pour mon HughClob qui était plus grand, j'ai dû utiliser deux appels en select:

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

j'appelais à partir D'une application Java alors j'ai simplement concaténé les parties 1 et 2 et envoyé un email.

4
répondu Cliff Bender 2017-02-20 13:11:07

pour les gros caillots, des sélections peuvent aussi être utilisées:

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

2
répondu Kapitula Alexey 2016-08-24 12:55:07

une autre option est de créer une fonction et d'appeler cette fonction à chaque fois que vous avez besoin de sélectionner la colonne 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;

et l'appel de la fonction;

SELECT tocharvalue, clob_to_char_func(tocharvalue, 1, 9999)
FROM (SELECT clob_column AS tocharvalue FROM table_name);
0
répondu Mustafa 2012-12-06 14:50:29

si vous utilisez SQL * Plus essayez ce qui suit...

set long 8000

select ...
-1
répondu Scott 2010-09-24 19:56:16

pour ajouter à la réponse.

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

end;
/

dbms_lob.substr

first parameterclob que vous voulez extraire .

Second parameter est la longueur de caillot que vous voulez extraire.

Third parameter est de quel mot vous voulez extraire .

dans l'exemple ci-dessus , je sais que ma taille de sabot est supérieure à 50000, donc je veux le dernier 4000 caractère .

-1
répondu Himanshu sharma 2017-11-20 14:47:58