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 :

Exporter les blobs [19c]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 95
    Par défaut Exporter les blobs
    Bonjour à toutes et tous,
    Soit une table FICHIERSPHYS_FIPH comme suit :

    FIPH_ID NUMBER(19) NO NO NO NO 3 19 0 1
    FIPH_DIS VARCHAR2(11 Byte) NO NO NO NO 12 11 -1 2
    CONTENU BLOB NO NO NO NO 2004 4000 -1 3
    TAILLE NUMBER(19) NO NO NO NO 3 19 0 4
    TYPEMIME VARCHAR2(20 Byte) NO NO NO NO 12 20 -1 5
    NOMFICHIER VARCHAR2(50 Byte) NO YES NO NO 12 50 -1 6
    EMETTEUR VARCHAR2(6 Byte) NO YES NO NO 12 6 -1 7
    FORMATFICHIER VARCHAR2(20 Byte) NO YES NO NO 12 20 -1 8
    J'ai donc des blobs, qui sont des fichiers zippés (.zip) que je souhaite récupérer afin de les retraiter (oui, nous avons un problème avec certains d'entre eux).

    Pour cela, j'essaie d'utiliser PL/SQL, que je ne maitrise absolument pas.
    Voici le contenu de mon script :
    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
     
    DECLARE
      v_start          NUMBER(38,0) := 1;
      v_size  CONSTANT NUMBER( 5,0) := 32000;
      v_len            NUMBER(38,0);
      v_buffer         RAW(32000);
      v_file           UTL_FILE.FILE_TYPE;
    BEGIN
      FOR r IN ( SELECT NOMFICHIER, CONTENU FROM FICHIERSPHYS_FIPH )
      LOOP
        v_file  := UTL_FILE.FOPEN(r.NOMFICHIER, 'wb', 32760 );
        v_len   := DBMS_LOB.GETLENGTH( r.CONTENU );
        WHILE v_start <= v_len LOOP
          DBMS_LOB.READ(
            r.CONTENU,
            LEAST( v_len - v_start + 1, v_size ),
            v_start,
            v_buffer
          );
     
          UTL_FILE.PUT_RAW( v_file, v_buffer );
          UTL_FILE.FFLUSH( v_file ); 
          v_start := v_start + v_size;
        END LOOP;
        UTL_FILE.FCLOSE( v_file );
      END LOOP;
    END;
    /
    Hélas, à l'exécution, j'obtiens le message suivant :
    start /tmp/plsql_OC242.sql
    LEAST( v_len - v_start + 1, v_size ),
    *
    ERROR at line 15:
    ORA-06550: line 15, column 9:
    PLS-00363: expression 'LEAST(+(-(V_LEN, V_START), 1), V_SIZE)' cannot be used as an assignment target
    ORA-06550: line 13, column 7:
    PL/SQL: Statement ignored
    Quelques recherches semblent indiquer qu'il s'agirait d'un problème de variable IN/OUT (An IN parameter is writing data to a stored procedure, an OUT parameter is reading data from a stored procedure, and an IN OUT parameter is writing data to and reading data from a stored procedure).
    Mais mes essais successifs n'ont pas permis d'aboutir à une solution.

    Auriez-vous des indications à me proposer?
    Je vous remercie et vous souhaite une bonne journée.
    Cordialement,
    Thomas

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 95
    Par défaut
    EDIT :
    il manquait bien évidemment des choses....

    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
    CREATE OR REPLACE PROCEDURE Write_BLOB_To_File
    AS
      v_start          NUMBER(38,0) := 1;
      v_size  CONSTANT NUMBER( 5,0) := 32000;
      v_len            NUMBER(38,0);
      v_buffer         RAW(32000);
      v_file           UTL_FILE.FILE_TYPE;
    --DECLARE
    --  v_start          NUMBER(38,0) := 1;
    --  v_size  CONSTANT NUMBER( 5,0) := 32000;
    --  v_len            NUMBER(38,0);
    --  v_buffer         RAW(32000);
    --  v_file           UTL_FILE.FILE_TYPE;
    BEGIN
      FOR r IN ( SELECT NOMFICHIER, CONTENU FROM FICHIERSPHYS_FIPH )
      LOOP
        v_file  := UTL_FILE.FOPEN(r.NOMFICHIER, 'wb', 32760 );
        v_len   := DBMS_LOB.GETLENGTH( r.CONTENU );
        WHILE v_start <= v_len LOOP
          DBMS_LOB.READ(
            r.CONTENU,
            LEAST( v_len - v_start + 1, v_size ),
            v_start,
            v_buffer
          );
     
          UTL_FILE.PUT_RAW( v_file, v_buffer );
          UTL_FILE.FFLUSH( v_file ); 
          v_start := v_start + v_size;
        END LOOP;
        UTL_FILE.FCLOSE( v_file );
      END LOOP;
    END Write_BLOB_To_File;
    /

    Pour autant, cela ne fonctionne pas
    start /tmp/plsql_OC242.sql

    Warning: Procedure created with compilation errors.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    UTL_FILE.FOPEN ( location IN VARCHAR2, filename IN VARCHAR2, open_mode IN VARCHAR2, max_linesize IN BINARY_INTEGER DEFAULT 1024) RETURN FILE_TYPE;

    Vous oubliez de passer le DIRECTORY comme premier paramètre.


  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 95
    Par défaut
    Bonjour JeitEmgie,
    ahum, je vous avais prévenu, je suis une buse (et surtout pas un DBA).

    Puis-je vous demander comment vous procéderiez pour indiquer par exemple un répertoire /tmp/fichiersphysiques ?

    Je vous remercie par avance.
    Cordialement,
    Thomas

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 95
    Par défaut
    Ok, je vais tenter quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    declare
    direct varchar2(100);
    ;
    begin
    direct := '/home/vvv/fff/';

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    un DIRECTORY est un objet DB qui est une référence sur un répertoire du file system visible par le serveur... et sur lequel le process/utilisateur ORACLE a les droits d'accès évidemment si vous voulez que cela soit utile…
    pas un répertoire de votre PC client.

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

Discussions similaires

  1. [2003][MySQL] Exporter les tables vers MySQL
    Par DavidDeTroyes dans le forum Access
    Réponses: 3
    Dernier message: 08/03/2006, 17h47
  2. [Interbase] Pb avec les blobs et les images !!
    Par Mike91 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/01/2006, 11h27
  3. c# et les blob MySQL
    Par marsufunky dans le forum Windows Forms
    Réponses: 3
    Dernier message: 17/11/2005, 10h26
  4. [IB7][Delphi 7] Les Blobs
    Par kmsoft dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 20/11/2004, 18h13
  5. Est-il possible d'exporter les données?
    Par frutix dans le forum Débuter
    Réponses: 8
    Dernier message: 21/06/2004, 10h27

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