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).

29
demandé sur Mark 2009-11-25 17:17:53

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.

16
répondu rag 2017-02-24 14:53:38

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(DBM‌​S_LOB.SUBSTR(<CLOB-Column>,3000,3001))),0)
+NVL(LENGTHB(TO_CHAR(DBM‌​S_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.

14
répondu Andrew Spencer 2014-07-03 10:10:11

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;
/
5
répondu TobiK 2013-07-25 07:54:58

NVL(longueur(clob_col_name),0) fonctionne pour moi.

3
répondu user5534142 2015-11-06 15:45:32

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;
2
répondu Nalla Krishna 2017-05-23 10:02:25

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 ?

0
répondu schlebe 2018-02-14 08:52:21

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
-3
répondu Imran 2012-04-04 16:33:02