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?
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;
Cela fonctionne
select DBMS_LOB.substr(myColumn, 3000) from myTable
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.
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
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);
si vous utilisez SQL * Plus essayez ce qui suit...
set long 8000
select ...
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 parameter
clob
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 .