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 :

Stockage d'un fichier dans un champ BLOB par passage de paramètres à procédures stockées


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 74
    Points : 44
    Points
    44
    Par défaut Stockage d'un fichier dans un champ BLOB par passage de paramètres à procédures stockées
    Le but est de mémoriser des fichiers en BD dans un champ de type BLOB sous Oracle 10g
    Pour cela on passe par la procédure stockée suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create or replace
    PROCEDURE   AJOUT_PJ (pID_PJ IN INTEGER, pPJ IN BLOB DEFAULT NULL) 
    IS
    BEGIN
     BEGIN
       INSERT INTO TABLE_PJ  ID_PJ, PJ ) VALUES ( pID_PJ, pPJ );
      EXCEPTION
        when OTHERS then
        raise_application_error(-20294, '{8}-Erreur lors de l''ajout d''une PJ de la documentation commerciale n° ['||pID_PJ||'] ' ||SQLERRM);
      END;   
    END;
    et le code delphi est des plus simple (composant ODAC):
    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
     
    begin
      if OpenDialog1.Execute = true
      then
      begin
        OraStoredProc1.Params.Clear;
        OraStoredProc1.StoredProcName := 'AJOUT_PJ';
        OraStoredProc1.Params.CreateParam(ftInteger,'pID_PJ',ptinput);
        OraStoredProc1.Params.CreateParam(ftBlob,'pPJ',ptinput);
        OraStoredProc1.ParamByName('pID_PJ').AsInteger := pID_PJ;
        OraStoredProc1.ParamByName('pPJ').LoadFromFile(OpenDialog1.FileName, ftBlob);
        try
          OraStoredProc1.ExecProc;
        except
          on E : Exception do
          ShowMessage(e.Message);
        end;
    end;
    Pour des fichiers < 32k, cela fonctionne correctement,
    pour des fichiers > 32k j'ai le message d'erreur suivant :

    ORA-01460: unimplemented or unreasonable conversion requested

    merci pour toute réponse de solution pour éviter cette erreur

  2. #2
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Il faut télécharger le fichier à partir du serveur ORACLE, aprés l'avoir copié dans un répertoire du même serveur (DIRECTORY)

    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
    CREATE OR REPLACE PROCEDURE AJOUT_PJ (pID_PJ      IN INTEGER,
                                  pFilename   IN VARCHAR2)
    IS
    fils   BFILE;
    amt    INTEGER;
    lobd BLOB;
    BEGIN
    BEGIN
    BEGIN
      INSERT INTO TABLE_PJ (ID_PJ, PJ)
           VALUES (pID_PJ, EMPTY_BLOB ());
      SELECT pj
        INTO lobd
        FROM table_pj
       WHERE id_pj = pId_pj;
      fils := BFILENAME ('MY_IMAGE_DIR', pfilename);
      DBMS_LOB.fileopen (fils, DBMS_LOB.file_readonly);
      amt := DBMS_LOB.getlength (fils);
      DBMS_LOB.loadfromfile (lobd, fils, amt);
      DBMS_LOB.fileclose (fils);
    EXCEPTION
      WHEN OTHERS
      THEN
         IF (DBMS_LOB.fileisopen (fils) = 1)
         THEN
            DBMS_LOB.fileclose (fils);
         END IF;
         RAISE;
    END;
    EXCEPTION
    WHEN OTHERS
    THEN
      raise_application_error (
         -20294,
            '{8}-Erreur lors de l''ajout d''une PJ de la documentation commerciale n° ['
         || pID_PJ
         || '] '
         || SQLERRM);
    END;
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 74
    Points : 44
    Points
    44
    Par défaut
    Merci pour votre réponse.

    Ne peut-on pas passer directement le fichier en paramètre BLOB pour éviter la copie du fichier sur le serveur ?

    Le programme exemple fonctionne bien pour des fichiers de taille < 32k, comment faire pour s'affranchir de cette limitation sous Oracle?

  4. #4
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Ne peut-on pas passer directement le fichier en paramètre BLOB pour éviter la copie du fichier sur le serveur ?
    Je pense que non, mais je peux me tromper.
    En tous cas, je fait toujours comme indiqué et ca marche sans problème
    (dans le programme appelant je copie le fichier vers le serveur oracle avant d'appeler la procédure)
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 74
    Points : 44
    Points
    44
    Par défaut Ne peut-on pas passer directement le fichier en paramètre BLOB pour éviter la copie du fichier sur le serveur
    En fait, cela fonctionne parfaitement si l'on ne passe pas par une procédure stockée mais par un TOraQuery
    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
     
    OraQuery3 : TOraQuery;
     
    begin
      IF OpenDialog1.Execute = true
      then
      begin
        OraQuery3.SQL.Clear;
        OraQuery3.SQL.Add('INSERT INTO TABLE_PJ  (ID_PJ, PJ) VALUES (:pID_PJ, :pPJ)');
        OraQuery3.Prepare;
        OraQuery3.ParamByName('pID_PJ').AsInteger := 1;
        OraQuery3.ParamByName('pPJ').LoadFromFile(OpenDialog1.FileName, ftBlob);
        try
          OraQuery3.ExecSQL;
        except
          on E : Exception do ShowMessage(e.Message);
        end;
      end;
    end;

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    There is no piecewise INSERT, UPDATE, or fetch routine in PL/SQL. Therefore, the amount of data that can be accessed from a LOB column or attribute is limited by the maximum character buffer size. PL/SQL supports character buffer sizes up to 32KB - 1 (32767 bytes). For this reason, only LOBs less than 32K bytes in size can be accessed by PL/SQL applications using the data interface for persistent LOBs.
    Clobs larger than 32k

  7. #7
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Citation Envoyé par BaldeckJ Voir le message
    En fait, cela fonctionne parfaitement si l'on ne passe pas par une procédure stockée mais par un TOraQuery
    Donc, il s'agit d'une problématique DELPHI/ODAC et pas PL/SQL ! Me gourre-je ?
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

Discussions similaires

  1. Insertion d'un fichier dans un champ blob
    Par malikoo dans le forum PL/SQL
    Réponses: 1
    Dernier message: 05/01/2009, 18h44
  2. [Oracle] Enregistrer fichier dans un champs de type BLOB
    Par madevilts dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 16/01/2008, 08h46
  3. Stockage d'une image dans un champ blob
    Par Wrack dans le forum JDBC
    Réponses: 3
    Dernier message: 29/04/2007, 21h48
  4. [DEBUTANT]Inserer des fichiers dans des champs blob
    Par tripper.dim dans le forum Débuter
    Réponses: 1
    Dernier message: 19/10/2006, 22h23
  5. Réponses: 2
    Dernier message: 25/01/2006, 21h25

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