Comment obtenir la taille en octets d'une colonne CLOB dans Oracle?
Comment obtenir la taille en octets d'une colonne CLOB
dans Oracle?
LENGTH()
et DBMS_LOB.getLength()
les deux retourne le nombre de caractères utilisés dans le CLOB
mais j'ai besoin de savoir combien d'octets sont utilisés (je fais face à plusieurs octets charactersets).
7 réponses
après quelques réflexions j'ai trouvé cette solution:
LENGTHB(TO_CHAR(SUBSTR(<CLOB-Column>,1,4000)))
SUBSTR
retourne seulement les premiers 4000 caractères (Taille max string)
TO_CHAR
convertit de CLOB
en VARCHAR2
LENGTHB
renvoie la longueur en octets utilisée par la chaîne.
j'ajoute mon commentaire comme réponse parce qu'il résout le problème original pour un plus large éventail de cas que la réponse acceptée. Remarque: vous devez toujours connaître la longueur maximale et la proportion approximative de caractères multi-octets que vos données.
si vous avez un noeud supérieur à 4000 octets, vous devez utiliser DBMS_LOB.SUBSTR rather than SUBSTR. noter que les paramètres montant et offset sont inversés dans DBMS_LOB.SUBSTR.
ensuite, vous pouvez avoir besoin de soustraire un montant inférieur à 4000, parce que ce paramètre est le nombre de caractères , et si vous avez des caractères multi-octets alors 4000 caractères seront plus de 4000 octets long, et vous obtiendrez" 15191092020 " parce que le résultat de la soustraction doit s'adapter dans un VARCHAR2 qui a une limite de 4000 octets. Exactement combien de caractères vous pouvez récupérer dépend le nombre moyen d'octets par caractère dans vos données.
donc ma réponse est:
LENGTHB(TO_CHAR(DBMS_LOB.SUBSTR(<CLOB-Column>,3000,1)))
+NVL(LENGTHB(TO_CHAR(DBMS_LOB.SUBSTR(<CLOB-Column>,3000,3001))),0)
+NVL(LENGTHB(TO_CHAR(DBMS_LOB.SUBSTR(<CLOB-Column>,6000,6001))),0)
+...
où vous ajoutez autant de morceaux que vous avez besoin pour couvrir votre sabot le plus long, et ajuster la taille des morceaux en fonction de la moyenne des octets par caractère de vos données.
essayez celui-ci pour les tailles de sabot plus grand que VARCHAR2:
nous devons diviser le sabot en parties de tailles compatibles "VARCHAR2", parcourir les longueurs B à travers chaque partie des données CLOB, et résumer tous les résultats.
declare
my_sum int;
begin
for x in ( select COLUMN, ceil(DBMS_LOB.getlength(COLUMN) / 2000) steps from TABLE )
loop
my_sum := 0;
for y in 1 .. x.steps
loop
my_sum := my_sum + lengthb(dbms_lob.substr( x.COLUMN, 2000, (y-1)*2000+1 ));
-- some additional output
dbms_output.put_line('step:' || y );
dbms_output.put_line('char length:' || DBMS_LOB.getlength(dbms_lob.substr( x.COLUMN, 2000 , (y-1)*2000+1 )));
dbms_output.put_line('byte length:' || lengthb(dbms_lob.substr( x.COLUMN, 2000, (y-1)*2000+1 )));
continue;
end loop;
dbms_output.put_line('char summary:' || DBMS_LOB.getlength(x.COLUMN));
dbms_output.put_line('byte summary:' || my_sum);
continue;
end loop;
end;
/
cochez le nom du segment LOB de dba_lobs en utilisant le nom de la table.
select TABLE_NAME,OWNER,COLUMN_NAME,SEGMENT_NAME from dba_lobs where TABLE_NAME='<<TABLE NAME>>';
utilise maintenant le nom de segment pour trouver les octets utilisés dans dba_segments.
select s.segment_name, s.partition_name, bytes/1048576 "Size (MB)"
from dba_segments s, dba_lobs l
where s.segment_name = l.segment_name
and s.owner = '<< OWNER >> ' order by s.segment_name, s.partition_name;
la solution simple est de lancer CLOB à BLOB et ensuite demander la longueur de BLOB !
le problème est que Oracle n'a pas une fonction qui cast CLOB à BLOB, mais nous pouvons simplement définir une fonction pour faire que
create or replace
FUNCTION clob2blob (p_in clob) RETURN blob IS
v_blob blob;
v_desc_offset PLS_INTEGER := 1;
v_src_offset PLS_INTEGER := 1;
v_lang PLS_INTEGER := 0;
v_warning PLS_INTEGER := 0;
BEGIN
dbms_lob.createtemporary(v_blob,TRUE);
dbms_lob.converttoblob
( v_blob
, p_in
, dbms_lob.getlength(p_in)
, v_desc_offset
, v_src_offset
, dbms_lob.default_csid
, v_lang, v_warning
);
RETURN v_blob;
END;
la commande SQL à utiliser pour obtenir le nombre d'octets est
SELECT length(clob2blob(fieldname)) as nr_bytes
ou
SELECT dbms_lob.getlength(clob2blob(fieldname)) as nr_bytes
j'ai testé ceci sur Oracle 10g sans utiliser Unicode(UTF-8). Mais je pense que que cette solution doit être correcte en utilisant Unicode (UTF-8) Oracle instance: -)
je veux rendre grâce à Nashev qui a posté une solution pour convertir clob en blob comment convertir CLOB en BLOB dans Oracle? et pour ce post écrit en allemand (le code est en PL/SQL) 13ter.info.blog qui donnent en outre une fonction pour convertir clob blob à !
quelqu'un Peut-il tester les 2 commandes en Unicode(UTF-8) CLOB donc Je suis sûr que ça marche avec Unicode ?
il ne fonctionne que jusqu'à 4000 byte, et si le clob est plus grand que 4000 bytes alors nous utilisons ce
declare
v_clob_size clob;
begin
v_clob_size:= (DBMS_LOB.getlength(v_clob)) / 1024 / 1024;
DBMS_OUTPUT.put_line('CLOB Size ' || v_clob_size);
end;
ou
select (DBMS_LOB.getlength(your_column_name))/1024/1024 from your_table