Bonjour à tous et merci par avance de consacrer un peu de temps à mon problème.
Je travail sur Oracle 10.2.0.4.0 et j'utilise le client Toad pour l'exécution de mes scripts.
Dans un contexte de correction de donnée sur un champ de type long, j'ai crée une fonction PL/SQL pour mettre à jour mon champs qui contient un bloc HTML (Il s'agit d'une table d'historique de mail envoyé).
Le nom de la table et PS_VB_MAIL_HIST et a pour clé primaire VB_ID_MAIL
voici le code de fonction :
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 SET DEFINE OFF; CREATE OR REPLACE FUNCTION VB_UPDATE_MAIL_DIFFUSION( vb_s_param1 IN varchar2) RETURN varchar2 IS vb_s_result VARCHAR2(32767); BEGIN FOR f IN (select a.vb_id_mail, a.vb_hub_email from ps_vb_mail_hist a where a.vb_agency_list is null and a.vb_id_mail_model = '2') LOOP UPDATE ps_vb_mail_hist SET vb_hub_email = REPLACE(REPLACE(REPLACE(f.vb_hub_email, CHR(13), ' '), CHR(10), ' '), '<td width = 15%>A :</td> <td width = 55%>','<td width = 15%>A :</td><td width = 55% style="word-wrap:break-word; width =300px;">') WHERE vb_id_mail = f.vb_id_mail; END LOOP; FOR f IN (select a.vb_id_mail, a.vb_hub_email from ps_vb_mail_hist a where a.vb_agency_list is null and a.vb_id_mail_model = '2') LOOP UPDATE ps_vb_mail_hist SET vb_hub_email = REPLACE(REPLACE(REPLACE(f.vb_hub_email, CHR(13), ' '), CHR(10), ' '), '<td width = 15%>cc :</td> <td width = 55%>','<td width = 15%>cc :</td><td width = 55% style="word-wrap:break-word; width =300px;">') WHERE vb_id_mail = f.vb_id_mail; END LOOP; vb_s_result := 'Fin'; RETURN vb_s_result; end VB_UPDATE_MAIL_DIFFUSION; / SET DEFINE ON; sho errors commit;
Je n'ai aucune erreur à la compilation
Pour éxécuter cette fonction, j'utilise le code suivant :
Sur ma base de dev, l'éxécution ne pose aucun probléme. Cependant en recette j'ai l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 declare x varchar2(400); begin x:=VB_UPDATE_MAIL_DIFFUSION('1'); end; / commit;
Aprés quelque recherche, il s'agirait d'un probléme de donnée dépassant une limite de caractère pour le champ de type long. La solution proposée dans le topic suivant propose de passer en CLOB :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ORA-01461: can bind a LONG value only for insert into a LONG column ORA-06512: at "SYSADM.VB_UPDATE_MAIL_DIFFUSION", line 9 ORA-06512: at line 4
Solution
Cependant n'existe t-il pas un moyen de mettre à jour ma table sans changer le format du champ ?
Merci d'avance.
Partager