Extraction du contenu d’un CLOB

Il n’est pas possible en SQL d’afficher le contenu d’un LOB (CLOB ou BLOB). Il faut donc passer par du PL/SQL pour extraire le contenu de ces champs dans un fichier.

Première étape, création d’un directory pour pouvoir écrire dans un fichier :

-- A LANCER AVEC LE USER SYSTEM

CREATE DIRECTORY EDITIONS AS '/home/oracle';
GRANT READ,WRITE ON DIRECTORY editions TO monUser;

Deuxième étape, constituer le ou les fichier(s) :


--
-- A LANCER AVEC L'UTILISATEUR monUser
-- Retrouve l'édition la plus grosse et
-- Crée le fichier dans le répertoire créé ci-dessus sur le serveur
--
SET SERVEROUTPUT ON;
DECLARE
	taille NUMBER;
	intitule Edition.Intitule%TYPE;
	blobFichier BLOB;
	buffer RAW(32767);
	dtFichier VARCHAR2(100);
	nomFichier VARCHAR2(250);
	ancienneEdition VARCHAR2(250);
	PROCEDURE genererFichier( iNomFichier IN VARCHAR2, bFichier IN BLOB ) IS
--	DECLARE
		fichierExport UTL_FILE.FILE_TYPE;
		amt BINARY_INTEGER;
		position INTEGER;
	BEGIN
		position := 1;
		amt := 32767;
		fichierExport := SYS.UTL_FILE.FOPEN('EDITIONS', iNomFichier, 'W', 32767);
		LOOP
			DBMS_LOB.READ(bFichier, amt, position, buffer);
			UTL_FILE.PUT_RAW(fichierExport, buffer, true);
			position := position + amt;
		END LOOP;
		EXCEPTION
		WHEN NO_DATA_FOUND THEN
			UTL_FILE.FCLOSE(fichierExport);
	END genererFichier;
BEGIN
	taille := 0;
	intitule := '';
	dtFichier := TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS');
	ancienneEdition := '';
	FOR e IN ( SELECT Edition.Edition_Id, Edition.Intitule, Document.Fichier, Modele_Edition.Libelle, Modele_Edition.Code FROM Edition, Document, Modele_Edition WHERE Edition.Edition_Id = Document.Edition_Id AND Edition.Modele_Edition_Code = Modele_Edition.Code ORDER BY Modele_Edition.Code) LOOP
		IF ( ancienneEdition = e.Code ) THEN
			IF ( DBMS_LOB.GetLength(e.Fichier) > taille ) THEN
				taille := DBMS_LOB.GetLength(e.Fichier);
				intitule := e.Intitule;
				blobFichier := e.Fichier;
				nomFichier := 'Exp_'||e.Libelle||'_'||dtFichier||'.rtf';
			END IF;
		ELSE
			-- Générer le fichier
			IF ( nomFichier IS NOT NULL ) THEN
				DBMS_OUTPUT.PUT_LINE(nomFichier);
				genererFichier( nomFichier, blobFichier );
			END IF;
			ancienneEdition := e.Code;
			taille := DBMS_LOB.GetLength(e.Fichier);
			intitule := e.Intitule;
			blobFichier := e.Fichier;
			nomFichier := 'Exp_'||e.Libelle||'_'||dtFichier||'.rtf';
		END IF;
	END LOOP;
END;
/

Troisième et dernière étape, suppression du directory créé pour l’occasion :

-- A LANCER AVEC LE USER SYSTEM
DROP DIRECTORY EDITIONS;

Laisser un commentaire