Oracle
 sql >> Base de données >  >> RDS >> Oracle

Insérer une chaîne de test BLOB supérieure à 2 000 ou 4 000 octets

Pour commencer, vous devez comprendre ce que sont les LOB. Ce sont des "données volumineuses", peut-être plus volumineuses que tout autre type de données dans Oracle. Ils sont comme des fichiers normaux sur un système de fichiers. Pour écrire dans un fichier sur un système de fichiers, vous devrez

  1. ouvrir le fichier en écriture
  2. tronquez le fichier si vous souhaitez recommencer à le remplir
  3. lire vos données source par tranches en boucle
  4. ajoutez vos blocs de données au fichier dans la même boucle, un par un
  5. fermer le fichier

Plus ou moins la même chose est vraie pour les LOB. Dans votre table, une colonne LOB (CLOB/BLOB/NCLOB) n'est qu'un pointeur/référence vers un autre endroit de votre stockage sur disque contenant les données réelles. Dans les termes standard d'Oracle, le pointeur est appelé "Localisateur LOB". Vous devez

  1. ouvrir/initialiser le localisateur LOB
  2. tronquer le contenu LOB, si vous souhaitez commencer à le remplir à partir de zéro
  3. ajoutez vos blocs de données au contenu LOB dans une boucle, un par un
  4. fermer le localisateur LOB

En PL/SQL, cela pourrait ressembler à ceci :

-- create table blob_test(id number, b blob);

declare 
  v_b blob; 
  aaa raw(32767);
  longLine varchar2(32767);
begin 
  longLine :=  LPAD('aaaa', 32767,'x');
  aaa := UTL_RAW.CAST_TO_RAW(longLine);
  insert into blob_test values(1,empty_blob()) returning b into v_b;
  dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  dbms_lob.writeappend(v_b,UTL_RAW.LENGTH (aaa) ,aaa);
  dbms_lob.close(LOB_LOC=>v_b);
  commit;
end;

Une explication :

  1. initialiser le localisateur LOB =insert into blob_test values(1,empty_blob()) returning b into v_b;
  2. ouvrir le localisateur LOB pour l'écriture =dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  3. tronquez le contenu du LOB, si vous souhaitez commencer à le remplir à partir de zéro... Ceci est fait par le empty_blob() appeler dans le insert .
  4. ajoutez vos blocs de données au contenu LOB dans une boucle, un par un =ici une seule itération de dbms_lob.writeappend() , en ajoutant un seul bloc aaa de longueur utl_raw.length(aaa) (maximum de 32767) dans le LOB v_b
  5. fermer le localisateur LOB =dbms_lob.close(LOB_LOC=>v_b);