J'ai fait quelques recherches sur le forum (et ailleurs) mais je n'ai rien trouver qui me satisfasse...Donc je demande.
J'ai un test suivit d'updates à effectuer sur plusieurs tables et j'aimerai l'encapsuler dans une procédure qui prendrait le nom de la table cible. histoire de ne pas me redéclarer un nouveau curseur avec sa boucle et tout le toutim à chaque nouvelle table qui a besoin du test
La création d'un curseur explicite n'étant pas possible vu que le nom de la table ne peut être passé en paramètre, il reste la création de la requête "à la volée" dans ma procédure. ce que j'ai fait et qui fonctionne:
Mais j'ai quelques réticences à utiliser ce code que je trouve assez "inélégant"PROCEDURE KDELCLOSEDTBSAMER(sTable string)
IS
sTbs varchar2(30);
sRowid varchar2(30);
vQuery varchar2(200);
crs csGetResultSet;
----
BEGIN
vQuery := 'SELECT ROWID,TBSCOD FROM ' || sTable || ' WHERE ENRTRT=0 AND not exists (select 1 from TCO5GIA where TBS=TBSCOD and LOC=''USA'')';
OPEN crs FOR vQuery;
LOOP
FETCH crs Into sRowid, sTbs;
EXIT WHEN crs%NOTFOUND;
--Loggue le code de la ligne en cours puis on efface
KLOGGIA.INS_TLOGGIA('E00018','','TAC1GIA',sTbs,'2','');
DELETE FROM TAC1GIA WHERE ROWID = sRowid;
END LOOP;
CLOSE crs;
END;
J'aimerai pouvoir créer un curseur implicitement avec la commande :
histoire de ne pas avoir à créer des variables (ou un recordset) pour récupérer les valeurs et de pouvoir utiliser "FOR UPDATE" et "CURRENT OF" pour éviter d'avoir à me coltiner le ROWID. Et enfin me passer du OPEN/FETCH/CLOSEFOR rec IN (SELECT ...) LOOP
Mais voilà quand j'essaye de placer ma vQuery entre les parenthèses j'ai droit à une erreur comme quoi ce n'est pas un curseur (sans blague). et quand j'essaye de la mettre directement, entre les quotes et la variable, je ne sais pas comment m'y prendre.
Quelqu'un aurait une solution?
Partager