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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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