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 :

Insertion d'une image d'un BLOB dans un document HTML [18c]


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut Insertion d'une image d'un BLOB dans un document HTML
    Bonjour à tous,

    J'ai un problème pour arriver à insérer une image dans un bloc HTML.
    J'explique l'environnement. Au final c'est pour envoyer un mail avec une procédure que je ne gère pas. Je me contente de lui envoyer tout ce dont elle a besoin, et elle envoie le mail.

    J'utilise des procédures et fonctions dans un package.
    Le package est quant à lui utilisé dans un écran Forms. Mais ce n'est pas important, puisque le problème est dans le code PL/SQL.

    Dans un premier temps, l'image que je veux utiliser est stockée dans une table Oracle, et donc dans un BLOB.

    Je fais donc juste un Select classique pour récupérer l'image dans une variable de type BLOB.

    C'est après que ça se complique.

    Je sois insérer ça dans une variable de type VARCHAR2, qui sera envoyée à la fonction qui envoie le mail.

    Voilà mon code :

    Procédure qui, si j'ai bien compris transforme le BLOB en CLOB :
    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
    PROCEDURE get_enc_img_from_tab (p_cod_p   IN VARCHAR2,
                                                          p_clob      IN OUT NOCOPY CLOB)
    AS
      l_clob CLOB;
      v_logo BLOB;
      l_step PLS_INTEGER := 12000;
    BEGIN
     
     
      SELECT logo INTO v_logo FROM Table WHERE cod=p_cod_p;
      FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(v_logo) - 1 )/l_step) LOOP
           DBMS_LOB.WRITEAPPEND(l_clob, LENGTH(UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(v_logo, l_step, i * l_step + 1)))), 
           UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(v_logo, l_step, i * l_step + 1))));
      END LOOP;
      SELECT p_clob || l_clob
      INTO   p_clob
      FROM   Table
      WHERE  cod = p_cod_p;
    END;
    Fonction qui insère le CLOB dans des balises HTML :
    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
    FUNCTION Ecrire_Header_Mail(
      P_Annee ANNEE.COD_ANU%TYPE,
      P_titre in VARCHAR2,
      P_Cod IN VARCHAR2
    )
    RETURN VARCHAR2 IS
      V_Header    VARCHAR2(5000);
      V_Annee_Sup VARCHAR2(4);
      V_Nom  VARIABLE.PAR_VAP%TYPE;
      L_Header    CLOB;
    BEGIN
      DBMS_LOB.createtemporary(L_Header, FALSE);
     
      V_Annee_Sup := TO_CHAR((TO_NUMBER(P_Annee) + 1));
     
     
      L_Header := '<tr style="padding-bottom: 20px;">'
        || '<td colspan="4" align="right"><img src="data:image/jpeg;base64,';
        get_enc_img_from_tab(p_cod_p => p_cod,
                             p_clob => L_Header);
        L_Header := L_Header || '" alt="logo" /></td>'
        || '<td colspan="2"><font color="#AAAAAA">'
        || 'TITRE A INSERER'
        ||  '</font></td><td colspan="2" align="right"><font color="#AAAAAA">'
        ||    'ANNEE ' || P_Annee || '/' || V_Annee_Sup || '<br />'
        ||    'TITRE 2'
        ||   '</font></td>'
        || '</tr>';
        SELECT DBMS_LOB.SUBSTR(L_Header, 5000,1) INTO V_Header FROM DUAL;
      RETURN TRIM(V_Header);
    END;
    Et quand j'utilise la fonction, j'ai une erreur dans la procédure get_enc_img_from_tab à la ligne où il y a DBMS_LOB.WRITEAPPEND, et j'ai ça comme erreur :
    Rapport d'erreur -
    ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur: invalid LOB locator specified: ORA-22275
    ORA-06512: à "SYS.DBMS_LOB", ligne 1163
    ORA-06512: à "PACK_MAIL", ligne 33
    ORA-06512: à "PACK_MAIL", ligne 63
    ORA-06512: à "PACK_MAIL", ligne 288
    ORA-06512: à ligne 15
    06502. 00000 - "PL/SQL: numeric or value error%s"
    *Cause: An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).
    *Action: Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.
    Si quelqu'un a une idée...
    Merci d'avance

    Michel

  2. #2
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut
    Bon déjà en modifiant cette ligne, ça va mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V_Header := DBMS_LOB.SUBSTR(L_Header, 32767,2147483647);
    Et j'ai changé ça aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        DBMS_LOB.WRITEAPPEND(l_clob, LENGTH(UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(v_logo, l_step, i * l_step + 1)))), 
        UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(v_logo, l_step, i * l_step + 1))));
    En ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        l_clob := l_clob || UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(v_logo, l_step, i * l_step + 1)));
    Je n'ai donc plus d'erreur à l'exécution... youpi !!
    Sauf que je n'ai rien du tout en sortie quand je lance cette fonction...

    C'est mieux mais pas terrible

    Si quelqu'un a une idée..

    Michel

  3. #3
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    "Sauf que je n'ai rien du tout en sortie quand je lance cette fonction... "
    Et si tu ajoutes sous SQL*Plus, avant d'appeler ta fonction, le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set serveroutput on
    appel fonction qui génère une sortie à l'écran
    Au fait, où est la ligne dans ton code qui doit afficher quelque chose?

  4. #4
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut
    Bonjour,

    Merci pour ta réponse.
    J'utilise bien tout ça. le SET SERVEROUPUT ON et le DBMS_OUTPUT.PUT_LINE
    Mais comme c'est quelque chose de classique, je ne l'avais pas mis.

    Mais déjà il y a quelque chose que je ne comprends pas je pense.
    C'est pourquoi et comment faut-il utiliser un CLOB pour visualiser une image dans un bloc HTML, alors qu'un CLOB, ce sont des caractères...

    L'image est stockée dans un BLOB au départ. Mais pourquoi passer par un CLOB ?

    Je suis un peu perdu en fait.

    Michel

  5. #5
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Aïe, le xml et les lob... c'est pas là où je suis le plus fort.
    Effectivement, je ne vois pas pourquoi tu utiliserais un CLOB pour stocker un BLOB.

    Quand tu dis dans ton message "Procédure qui, si j'ai bien compris transforme le BLOB en CLOB" : de ce que je comprends, ce n'est pas ta procédure.
    Tu l'as trouvée sur le net ou bien c'est issu d'un autre développeur de ta boite mais qui est parti?

  6. #6
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut
    En fait j'ai essayé plein de choses, autant venant de ce que j'ai pu trouver sur Internet, et aussi ce que j'ai trouvé sur du code existant. Rien n'a fonctionné.

    Au final, ce que je veux semble assez simple.
    Je veux envoyer un mail avec une image (un logo). Ce mail est forcément au format HTML.
    L'image est stockée dans une table dans un BLOB.

    Et tout le code est en PL/SQL, dans des procédures et fonctions dans un package.

    Je ne veux pas forcément utiliser des CLOB, je veux juste que ça fonctionne

    Michel

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Je n'ai pas regardé le code, mais j'ai déjà travaillé sur des envois de mail en plsql avec des attachements.
    Un mail est composé de caractères imprimables, donc on ne peut pas y mettre du binaire. Tous les fichiers binaires sont encodés (ici en base64)

    Par contre, 5000 caractères c'est pas beaucoup, et puis du SELECT au lieu d'une affectation simple en plsql ce n'est pas utile (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DBMS_LOB.SUBSTR(L_Header, 5000,1) INTO V_Header FROM DUAL;
    => V_Header  := DBMS_LOB.SUBSTR(L_Header, 5000,1);
    Comment as-tu vérifié ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    decalre
    v_retour VARCHAR2(5000);
    BEGIN
     v_retour := Ecrire_Header_Mail( P_Annee => xxxx, P_titre => 'xxx', P_Cod => 'xxx');
    dbms_output.put_line('Retour ('|| length(v_retour) ||')');
    dbms_output.put_line(v_retour);
    END;
    Enfin pour débugguer, il suffit de mettre des dbms_output au sein des différentes parties du code

  8. #8
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut
    Merci pour votre aide.

    Finalement j'ai tout revu mon problème. Et ça venait du fait que je mélangeais un peu tout, CLOB et varchar2.
    Un collègue a moi a trouvé la solution.
    Le logo apparaît bien maintenant.


    Michel

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

Discussions similaires

  1. Oracle 8i : insertion d'une image dans un BLOB
    Par garfield_fr dans le forum SQL
    Réponses: 0
    Dernier message: 02/12/2010, 14h04
  2. [Joomla!] Insérer une image de type blob dans la base de données Joomla coding
    Par h.hassal dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 12/06/2010, 18h52
  3. Réponses: 15
    Dernier message: 29/07/2009, 13h33
  4. Réponses: 1
    Dernier message: 31/03/2007, 10h16

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