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;