Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/08/2008, 14h30   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 44
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 44
Points : 12
Points : 12
Par défaut [BLOB]Comment ça marche?

Bonjour,

Je post pour la première fois parceque habituellement je trouve toujours mon bonheur sur le site, mais là ça coince.

J'essaye en vain d'utiliser les champs de type BLOB sous oracle.

Mon objectif est assez simple, enregistrer des fichiers binaire et les restituer.

Je précise que je suis sous ORACLE 10G (10.2.0.3).

J'ai suivi à la lettre le tutorial proposé ici

J'arrive apparement à enregistrer mon fichier binaire mais impossible de le restituer.

j'ai bien tenté de chercher une solution dans le forum mais rien de bien précis sur la restitution. Je me demande s'il faut pas faire de la programmation externe à ORACLE pour pouvoir resortir mon fichier.

Au secour !!! et merci pour toute aide.
xanass est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 14h58   #2
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Depuis la 10g, il est possible de générer des fichier binaires avec le package utl_file. Regarde de ce côté.
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 15h19   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 44
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 44
Points : 12
Points : 12
Merci pour la piste UTL, cela m'a permis de mieux comprendre le tutoriel sur le sujet.

Néanmoins, même si la procedure de restitution du tutoriel semble fonctionner (du moins j'ai un message de réussite) mon fichier n'apparait pas dans le repertoire

Merci encore je vais creuser la piste UTL.

Si quelqu'un a une autre idée?
xanass est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 15h29   #4
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Où est ton répertoire ? Comment l'as-tu créé ? Quel est ton code (création des directories, création de la procédure PL, exécution de la procédure) ?
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 16h00   #5
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 44
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 44
Points : 12
Points : 12
Alors j'ai simplement suivi le tuto en remplaçant ce qu'il y avait à remplacer

donc voici la liste des chose à faire
je précise que mon serveur oracle est sous solaris10.

J'ai créé un repertoire directement sous mon serveur avec les droits à tout le monde

J'ai indiqué mon répertoire sous oracle
Code :
CREATE directory blobdirectory AS 'monrepertoire';
J'ai donné les droits à mon user oracle
Code :
GRANT READ ON directory blobdirectory TO useroracle;
Pour ce qui est de l'insertion du blob j'ai suivi strictement le tuto

Pour l'extraction voilà ce que j'ai écrit:

Code :
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
CREATE OR REPLACE PROCEDURE EXTRACT_BLOB(p_id NUMBER, p_name VARCHAR2) AS
  v_file       utl_file.file_type;
  v_repertoire VARCHAR2(512) := 'BLOBDIRECTORY';
  v_fichier    VARCHAR2(256) := p_name;
  v_buffer     RAW(32000);
  v_offset     PLS_INTEGER DEFAULT 1;
  v_taille     PLS_INTEGER;
  v_longueur   PLS_INTEGER;
  v_chunk      PLS_INTEGER;
  v_blob       BLOB;
BEGIN
 -- On récupére le BLOB
  SELECT BINARYFILE INTO v_blob FROM MATABLE WHERE ID = p_id;
  -- On l'ouvre en lecture afin de pouvoir le parser plus facilement
  dbms_lob.OPEN(v_blob, dbms_lob.lob_readonly);
  -- On regarde la taille de Chunk idéale
  v_chunk := dbms_lob.getchunksize(v_blob);
  -- On regarde sa longueur
  v_longueur := dbms_lob.getlength(v_blob);
  -- On crée le fichier sur le disque dur
  v_file     := utl_file.fopen(v_repertoire, v_fichier, 'w', 32767);
  -- On ecrit dans le fichier tant que l'on a pas fait tout le BLOB
  WHILE v_offset < v_longueur LOOP
    IF v_longueur - (v_offset - 1) > v_chunk THEN
      v_taille := v_chunk;
    ELSE
      v_taille := v_longueur - (v_offset - 1);
    END IF;
    v_buffer := NULL;
    -- On lit la partie du BLOB qui nous interesse
    dbms_lob.READ(v_blob, v_taille, v_offset, v_buffer);
    -- On ecrit cette partie dans le fichier
    utl_file.put(file => v_file, buffer => utl_raw.cast_to_varchar2(v_buffer));
    utl_file.fflush(file => v_file);
    v_offset := v_offset + v_taille;
  END LOOP;
  -- On ferme le BLOB
  dbms_lob.CLOSE(v_blob);
  -- On ferme le fichier
  utl_file.fclose(v_file);EXCEPTION
  WHEN OTHERS THEN
    IF dbms_lob.ISOPEN(v_blob) = 1 THEN
      dbms_lob.CLOSE(v_blob);
    END IF;
    IF utl_file.is_open(file => v_file) THEN
      utl_file.fclose(file => v_file);
    END IF;
END;
J'execute mon code:
Code :
execute EXTRACT_BLOB(1,'toto.dat');
SQLPLUS me répond
Code :
Procédure PL/SQL terminée avec succès.
mais j'ai rien dans mon répertoire.
xanass est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 16h04   #6
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Peux-tu mettre en commentaire le bloc exception de ta procédure, afin que l'on sache s'il n'y a pas une exception détectée ?
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 16h17   #7
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 44
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 44
Points : 12
Points : 12
Code :
1
2
3
4
5
6
ERREUR à la ligne 1 :
ORA-29289: accès refusé au répertoire
ORA-06512: à "SYS.UTL_FILE", ligne 33
ORA-06512: à "SYS.UTL_FILE", ligne 436
ORA-06512: à "DSC_TRC.EXTRACT_BLOB", ligne 21
ORA-06512: à ligne 1
Ok je viens de comprendre, erreur de débutant.

J'avais pas accordé les droits en écriture à mon user.

Et Ô miracle ça marche.

Merci pour le coup de main
xanass est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h55.


 
 
 
 
Partenaires

Hébergement Web