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 :

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;
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
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
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 :

Solution

Cependant n'existe t-il pas un moyen de mettre à jour ma table sans changer le format du champ ?

Merci d'avance.