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 :
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 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;
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 :
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;
Si quelqu'un a une idée...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.
Merci d'avance
Michel
Partager