IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

[BLOB]Comment ça marche?


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 45
    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.

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    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 862
    Par défaut
    Depuis la 10g, il est possible de générer des fichier binaires avec le package utl_file. Regarde de ce côté.

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 45
    Par défaut
    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?

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    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 862
    Par défaut
    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) ?

  5. #5
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 45
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE directory blobdirectory AS 'monrepertoire';
    J'ai donné les droits à mon user oracle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    execute EXTRACT_BLOB(1,'toto.dat');
    SQLPLUS me répond
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Procédure PL/SQL terminée avec succès.
    mais j'ai rien dans mon répertoire.

  6. #6
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    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 862
    Par défaut
    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 ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ToAsciiEx, comment cela marche ?
    Par mikyfpc dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/02/2004, 21h39
  2. [MFC] list box : comment ça marche
    Par runn2 dans le forum MFC
    Réponses: 4
    Dernier message: 28/01/2004, 12h36
  3. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo