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

SQL Oracle Discussion :

Soucis d'insertion et de SELECT de champ BLOB


Sujet :

SQL Oracle

  1. #1
    Lucas Panny
    Invité(e)
    Par défaut Soucis d'insertion et de SELECT de champ BLOB
    Bonjour,

    Dans le but d'insérer un champ BLOB ainsi que de le lire (SELECT), je connais grâce à l'article d'Helyos (http://helyos.developpez.com/lob/) que l'on peut pas faire un INSERT basique sur un blob et de même pour le select !!
    J'ai alors essayé l'exemple d'Helyos (partie BLOBs)
    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
    CONNECT system / < pass > 
    CREATE directory blobdir AS 'c:\temp\';
    GRANT READ ON directory blobdir TO scott;
     
    CREATE TABLE scott.t_blob (id number, image blob);
     
    CREATE OR REPLACE PACKAGE scott.sql_blob IS
     
      -- Procédure servant à ajouter un BLOB à notre table.
      -- p_id correspond à l'id
      -- p_name correspond au nom du fichier à inserer.
      PROCEDURE add_blob(p_id NUMBER, p_name VARCHAR2);
     
    END sql_blob;
    /
    CREATE OR REPLACE PACKAGE BODY scott.sql_blob IS
     
      PROCEDURE add_blob(p_id NUMBER, p_name VARCHAR2) IS
        v_blob  BLOB;
        v_bfile BFILE;
      BEGIN
        -- On insére la ligne avec un blob vide dont on récupère le pointeur
        INSERT INTO t_blob
        VALUES
          (p_id, empty_blob())
        RETURNING image INTO v_blob;
        -- On déclare un pointeur vers notre fichier
        v_bfile := bfilename(directory => 'BLOBDIR', filename => p_name);
        -- On ouvre ce fichier
        dbms_lob.fileopen(v_bfile);
        -- On rempli l'emplacement du BLOB vide dans la table avec le contenu de notre fichier
        dbms_lob.loadfromfile(v_blob, v_bfile, dbms_lob.getlength(v_bfile));
        -- On ferme le fichier
        dbms_lob.fileclose(v_bfile);
      END;
    END sql_blob;
    /
    Tout est OK jusque là mais lorsqu'on teste enfin la procédure du package:
    exec sql_blob.add_blob(1,'toto.bmp');
    De même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec scott.sql_blob.add_blob(1,'C:\temp\toto.bmp');
    L'erreur est :
    ERREUR à la ligne 1 :
    ORA-22288: échec de l'opéation FILEOPEN sur le fichier ou le LOB
    Le fichier spécifié est introuvable.
    ORA-06512: à "SYS.DBMS_LOB", ligne 504
    ORA-06512: à "SCOTT_BLOB", ligne 15
    ORA-06512: à ligne 1


    Or, ce fichier toto.bmp existe bel et bien

  2. #2
    Lucas Panny
    Invité(e)
    Par défaut
    Pour ORA-22288: échec de l'opéation FILEOPEN sur le fichier ou le LOB c'est en fait du au fait que j'avais cru que le répertoire est en local alors que c'est sur le serveur

    Mais il y une autre erreur sur la 2ème procédure:
    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
    PROCEDURE write_blob(p_id NUMBER, p_name VARCHAR2) IS
      v_file       utl_file.file_type;
      v_repertoire VARCHAR2(512) := 'c:\temp\';
      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 image INTO v_blob FROM t_blob WHERE id = 1;
    .................................
      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;
    Rien qu'avec ce premier SELECT BLOB, il y a exception, l'exécution entre donc dans la partie WHEN OTHERS THEN !! select sur un champ blob se fait-il ??
    L'erreur est :
    ERREUR à la ligne 1 :
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at "SCOTT.SQL_BLOB", line 34
    ORA-06512: at line 1

    Ligne 34 = le SELECT donc l'exécution n'arrive pas à passer cette instruction car il s'agit d'un champ BLOB !!
    Dernière modification par Lucas Panny ; 14/04/2008 à 14h55.

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Quelle est la deuxieme erreur?

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 306
    Points
    5 306
    Par défaut
    ORA-01422: exact fetch returns more than requested number of rows
    Un select ... into ... nécessite qu'une seule ligne de résultat soit retournée.

    Apparamment, ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     SELECT image INTO v_blob FROM t_blob WHERE id = 1;
    te retourne plus d'une ligne... Cela n'a rien a voir avec la nature du champ...

  5. #5
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Cela n'a rien a voir avec la nature du champ...
    Et oui !!

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    as tu tenté de retirer le \ final de c:\temp\

  7. #7
    Lucas Panny
    Invité(e)
    Par défaut
    L'erreur est maintenant
    BEGIN sql_blob.write_blob(1,'hivernal.jpg'); END;

    *
    ERREUR à la ligne 1 :
    ORA-29280: invalid directory path
    ORA-06512: at "SYS.UTL_FILE", line 18
    ORA-06512: at "SYS.UTL_FILE", line 424
    ORA-06512: at "SCOTT.SQL_BLOB", line 43
    ORA-06512: at line 1

    Le SELECT n'a donc plus de problème mais sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v_file     := utl_file.fopen(v_repertoire, v_fichier, 'w', 32767);
    as tu tenté de retirer le \ final de c:\temp\
    l'erreur ne change pas, je crois même que le \ est utile

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Attend je crois que tu fais un amalgamme entre un directory Oracle et utl file

    tu utilises la variable v_repertoire qui contient un repertoire physique (qui serait plus pour utl file ) alors que tu as défini un directory juste au début blobdir

    donc peut tu tester de mettre v_repertoire :='BLOBDIR';

  9. #9
    Lucas Panny
    Invité(e)
    Par défaut
    Ça marche maintenant avec ça Helyos !

    Mais le bug d'Oracle 9i se produit rendant le jpg in-ouvrable !!
    En fait, faut-il donc toujours définir un DIRECTORY ?

  10. #10
    Lucas Panny
    Invité(e)
    Par défaut
    Un SELECT sur un champ BLOB n'a aucun problème dans une procédure mais ce n'est pas faisable en dehors avec les outils comme MS ADO ou l'ODBC, il y a exception.
    C'est pour cela que je me demande si une procédure retournant un BLOB est-ce que ça se fait ?

  11. #11
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 306
    Points
    5 306
    Par défaut
    Citation Envoyé par Lucas Panny Voir le message
    Un SELECT sur un champ BLOB n'a aucun problème dans une procédure mais ce n'est pas faisable en dehors avec les outils comme MS ADO ou l'ODBC, il y a exception.
    ???????

  12. #12
    Lucas Panny
    Invité(e)
    Par défaut
    En fait, le titre de la discussion est : Soucis d'insertion et de SELECT de champ BLOB
    Et là, le SELECT sur un champ blob génère une exception avec ADO, ODBC, etc. (Ce type de données n'est pas pris en charge.) Que faire ?
    Mais exécuter un select à l'intérieur d'une procédure n'a aucun problème, c'est pour cela que je me demande si on peut créer une procédure retournant du BLOB ou y a-t-il une alternative au BLOB (comme sous SQL Server où il y a IMAGE !!)

    A propos des DIRECTORY, n'est-il pas possible de charger un fichier dans une bd sans avoir recours à DIRECTORY ?
    Dernière modification par Lucas Panny ; 15/04/2008 à 12h26.

  13. #13
    Lucas Panny
    Invité(e)
    Par défaut
    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE  PROCEDURE "SCOTT"."X_GETBLOB"  (v_blob OUT BLOB)
    IS
    BEGIN
      SELECT IMAGE INTO V_BLOB FROM T_BLOB WHERE ID = 1;
      EXCEPTION
      WHEN NO_DATA_FOUND THEN
          V_BLOB := EMPTY_BLOB();
    END;
    Comment faire pour le tester ?
    J'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SET serveroutput ON;
     
    variable bl blob;
    /
    exec scott.x_getblob(:n);
    mais ça ne marche qu'avec number et varchar

  14. #14
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 306
    Points
    5 306
    Par défaut
    Citation Envoyé par Lucas Panny Voir le message
    En fait, le titre de la discussion est : Soucis d'insertion et de SELECT de champ BLOB
    Et là, le SELECT sur un champ blob génère une exception avec ADO, ODBC, etc. (Ce type de données n'est pas pris en charge.) Que faire ?
    Mais exécuter un select à l'intérieur d'une procédure n'a aucun problème, c'est pour cela que je me demande si on peut créer une procédure retournant du BLOB ou y a-t-il une alternative au BLOB (comme sous SQL Server où il y a IMAGE !!)

    A propos des DIRECTORY, n'est-il pas possible de charger un fichier dans une bd sans avoir recours à DIRECTORY ?
    Si tu veux manipuler des lobs Oracle (blob, clob, nclob, file), il te faut évidemment une API qui puisse les manipuler !!

    En ODBC, apparemment, ils sont mappés sur SQL_LONGVARCHAR et SQL_LONGVARBINARY...

    Pour manipuler des blobs au sein d'une application avec Oracle, rien de mieux que d'utiliser les API Oracle ou basées sur Oracle qui savent très bien gérer les blobs...

    Mais si tu n'a pas le choix.... Essaie de voir les forums ADO et OBDC peut être ?

  15. #15
    Lucas Panny
    Invité(e)
    Par défaut
    Je me dois d'utiliser ADO en C++!!
    C'est ce SELECT sur un champ BLOB qui ne marche pas : c'est cela qui me gêne beaucoup beaucoup !!
    Je vais en parallèle les autres forums

  16. #16
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 306
    Points
    5 306
    Par défaut
    Apparemment ADO gère les blobs...

    Effectivement, il faut plutot aller voir du coté du forum ADO pour ce problème la....

  17. #17
    Lucas Panny
    Invité(e)
    Par défaut
    Une autre question concernant le tuto d'Helyos (http://helyos.developpez.com/lob/): la technique d'enregistrement et de restitution du BLOB utilise les DIRECTORY Oracle nécessitant l'existence des fichiers sur le serveur.
    Comment faire si le fichier est sur le client qui exécute ces procédures?
    Et aussi, ne peut-on donc pas faire autrement qu'utiliser DIRECTORY ?

  18. #18
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Points : 280
    Points
    280
    Par défaut
    salut j ai lu en assez rapidement et en diagonale mais il y a quelques anness j avais eu un probleme avec un champ IMAGE , odbc et access ( ouais c etait pas oracle) via ado.net. une requete ne fonctionnait pas car le mot image etait reserve et je devait si je me rappelle bien taper . desole si ca n a rizen a voir

  19. #19
    Lucas Panny
    Invité(e)
    Par défaut
    Alors qu'en pensez-vous ?

Discussions similaires

  1. Insertion d'image dans un champ BLOB
    Par aminus19 dans le forum MySQL
    Réponses: 2
    Dernier message: 06/05/2010, 14h26
  2. Select/Update champs blob (texte)
    Par agimation dans le forum Powerbuilder
    Réponses: 4
    Dernier message: 22/09/2009, 10h06
  3. une insertion à partir d'une selection + un champ fixe
    Par Smix007 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/05/2007, 14h59
  4. INSERT à partir d'un SELECT avec champ SERIAL
    Par bruno.wiesen dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/03/2007, 11h07
  5. [MySQL] Pb d'insertion d'une valeur de champ select dans une Bdd
    Par Mimisator dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 20/10/2005, 18h51

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