Hello,
c'est bien comme ça qu'il faut t'y prendre, mais à l'intérieur de la chaine que tu passes à EXECUTE IMMEDIATE, il doit y avoir seulement une requête, et pas du code PL/SQL.
Par exemple, dans ton bloc
1 2 3 4 5 6 7 8 9 10
| execute immediate ('for Cur in C_SERV LOOP
BEGIN
update ' || table_name || ' set COM_SERVICE = (select distinct COM_SERVICE||' '||Cur.SVC_TECH_LIB from ' || table_name ||
'where PRESTATION_ID = Cur.PRESTATION_ID)
where PRESTATION_ID = Cur.PRESTATION_ID;
EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
WHEN OTHERS then null;
END;
COMMIT;
END LOOP'); |
il faut laisser ta boucle écrite normalement, et lancer le execute immediate seulement sur ta requête update. Ce qui donnerait (mais tu vas voir plus bas que ça ne conviendra pas car tu devras parcourir le curseur manuellement)
1 2 3 4 5 6 7 8 9 10
| for Cur in C_SERV LOOP
BEGIN
EXECUTE IMMEDIATE('update ' || table_name || ' set COM_SERVICE = (select distinct COM_SERVICE||' '||Cur.SVC_TECH_LIB from ' || table_name ||
'where PRESTATION_ID = Cur.PRESTATION_ID)
where PRESTATION_ID = Cur.PRESTATION_ID;
EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
WHEN OTHERS then null');
END;
COMMIT;
END LOOP; |
Pour le curseur il faut :
- définir un type curseur (soit dans la partie déclarative de ta procédure, soit dans la partie déclarative de ton package...)
TYPE mycurseur IS REF CURSOR;
- dans ton code, tu déclares une variable cur de type mycurseur, puis tu l'initialises après ton begin :
OPEN cur FOR 'select toto from tata'
Bien sûr, tu peux remplacer le "select toto from tata" par une chaine de caractères que tu auras remplie en concaténant le nom de ta table.
Tu dois alors parcourir le curseur en faisant des fetch, tu ne peux pas utiliser de boucle for.
Du coup n'oublies pas de fermer ton curseur.
Partager