Les LOB pour contourner les limites de LONG

LONG est un type de données d'oracle qui est déprécié depuis la version 9i, Oracle n'a pas encore complètement supprimé sa compatibilité jusqu'à la version 11g ; cependant, il ne présente plus aucun intérêt par rapport à son remplaçant : les LOB.

Pour des raisons historiques, certaines bases possèdent encore des colonnes de type LONG, il s'agit alors de contourner les limites et d'utiliser la puissance des LOB lors de l'interrogation des colonnes. Pour ce faire l'utilisation d'une table temporaire nous sera utile :

Pour obtenir des statistiques sur les documents de mon interlocuteur :
create [temporary] table doc_temp (id_doc, doc , date_p) as
select id_document, to_lob(document), date_p from doc natural join interlocuteur where mail_interlocuteur = 'mon_interlocuteur@son_domaine.fr'


Attention, le traitement d’un trop grand nombre de LONG en LOB peut être long (20 min pour 50 000 tuples), penser alors à ajouter dans les conditions la clause rownum < xxx.

select avg(dbms_lob.getlength(doc)) moy, sum(dbms_lob.getlength(doc)) somme, count(id_doc) nb, max(dbms_lob.getlength(doc)) maxi, date_p from doc_temp
group by date_p
order by maxi desc

commit;


Pour une migration complète, la procédure consiste en la création d'une nouvelle table à l'image de la première, la suppression de la table d'origine et le renommage de notre table finale. Nous prendrons soin de placer des commit de manière régulière afin de ne pas lever l'erreur de tablespace UNDO trop petit (voir la technique décrite pour les traitements de masse) :

-- Ce script est valable à partir de Oracle9i
create table doc_temp (id_doc, doc , date_p, rowid_tmp) as
select id_document, to_lob(document), date_p, rowid from doc
where rownum < 50000;
commit;

delete from doc where rowid in (select rowid_tmp from doc_temp);
commit;

ALTER TABLE doc_temp DROP COLUMN rowid_tmp;

ALTER TABLE doc_temp RENAMME TO doc;




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories