Bonjour à tous,
est ce que qulequ'un aurait un exemple de PL/SQL permettant d'écrire un BLOB dans un fichier sur disque avec les restrictions suivantes :
-Oracle 9
-Taille de BLOB > 32767 octets
- Contenu binaire
Merci pour votre aide.
Bonjour à tous,
est ce que qulequ'un aurait un exemple de PL/SQL permettant d'écrire un BLOB dans un fichier sur disque avec les restrictions suivantes :
-Oracle 9
-Taille de BLOB > 32767 octets
- Contenu binaire
Merci pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 CREATE OR REPLACE PROCEDURE Write_Binary_File ( PC$Directory IN VARCHAR2 ,PC$File_Name IN VARCHAR2 ,PC$SQL_Order IN VARCHAR2 ,PB$Raise IN BOOLEAN DEFAULT FALSE ) -- ------------------------------------------- -- Procedure to dump a BLOB column onto a file -- ------------------------------------------- -- parameters: -- PC$Directory : name of an existing Oracle Directory -- PC$File_Name : name of the expected output file -- PC$SQL_Order : SQL order to select the BLOB column -- PB$Raise : boolean to indicate if the process -- would be stopped after an error -- IS src_lob BLOB; buffer RAW(16384); amt BINARY_INTEGER := 16384; pos INTEGER := 1; LF$FicOUT UTL_FILE.FILE_TYPE ; LC$Msg VARCHAR2(2000) ; BEGIN -- get the BLOB column -- BEGIN EXECUTE IMMEDIATE PC$SQL_Order INTO src_lob ; EXCEPTION WHEN NO_DATA_FOUND THEN LC$Msg := 'Write_Binary_File(): NO_DATA_FOUND' ; IF PB$Raise THEN RAISE_APPLICATION_ERROR( -20100, LC$Msg ) ; END IF ; DBMS_OUTPUT.PUT_LINE(LC$Msg) ; RETURN ; END ; -- open the output file -- LF$FicOUT := UTL_FILE.FOPEN( PC$Directory, PC$File_Name, 'W', 32764 ) ; -- write the file -- LOOP -- read the chunks -- Dbms_Lob.READ (src_lob, amt, pos, buffer); -- write the chunks -- UTL_FILE.Put_Raw(LF$FicOut, buffer); pos := pos + amt; END LOOP; -- close the file -- UTL_FILE.FCLOSE(LF$FicOut); EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(LF$FicOut); WHEN OTHERS THEN LC$Msg := 'Write_Binary_File() Error : ' || TO_CHAR( SQLCODE ) || ' while managing file (' || PC$Directory || ') ' || PC$File_Name ; IF PB$Raise THEN RAISE_APPLICATION_ERROR( -20100, LC$Msg ) ; END IF ; DBMS_OUTPUT.PUT_LINE(LC$Msg); END Write_Binary_File; /
Merci mais cette fonction (que j'avait déjà trouvé par ailleurs) ne semble pas fonctionner avec un pdf ??
A l'ouverture du pdf, un obtient une erreur .
Je pense que certains caractères ont été interprétés (CR, LF, caractères spéciaux utilisés par le format pdf...)
Je viens de l'utiliser avec un fichier PDF, généré sur une machine Unix et rapatrié sur mon poste Windows avec FileZilla et je le consulte sans problème.
Essayez de voir si le fichier n'est pas déjà "comme cela" dans la colonne BLOB.
Je viens de rapatrier directement le contenu du blob et j'arrive bien à l'ouvrir et le visualiser correctement.
est ce que ton fichier pdf est > 32767 octets ?
Je viens également de faire le test avec succès sur un PDF de plus de 7Mo
J'utiliserais le mode 'WB'
Code : Sélectionner tout - Visualiser dans une fenêtre à part LF$FicOUT := UTL_FILE.FOPEN( PC$Directory, PC$File_Name, 'W', 32764 ) ;
Il ne s'agit pas ici d'erreur d'écriture du fichier.
J'ai essayé Write_Binary_File sous 10gR1, WinXP avec 'W' et 'WB' est il y a un différence. Sans "binary" (WB) le fichier et corrompé (chr(13)=CR sont ajoutés).
Je ne connais pas la solution pour Ora9.
Ok. Il n'y a plus a espérer que notre ami travaille bien sur une base 10g![]()
Partager