Bonjour,
contexte : package PL SQL avec procédure stockée
Je dois traiter plusieurs tables source TS1, TS2, ...
Pour chaque enregistrement source, il faut effectuer insert/update dans plusieurs tables de destination TD1, TD2, ...
Tout ceci est paramétré dans la table de paramétrage laquelle je charge dans un VARRAY
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
  TYPE TCIB_TYP IS RECORD (
  TAB_BD varchar2(100),
  SELECT_ITF varchar2(4000), -- liste de colonne source
  CHAMPS_BD varchar2(4000), -- nom colonnes table TD
  CHAMPS_ITF varchar2(4000), -- 
  CHAMPS_SET varchar2(4000), -- clause 'SET' pour update
  CLAUSE_PK varchar2(4000) -- clause 'WHERE' pour update
  );
 tcib_tab TCIB_TAB_TYP;
Après ce chargement, j'exécute du sql dynamique dans une procédure
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
 
...
DECLARE
stmt vrchar2(4000);
BEGIN
ici un traitement en boucle par table source TS(n) initialise une collection varray avec les noms de tables à traiter, les clause where et les clauses set.
Je voudrais ensuite effectuer pour chaque Table Source TS(n) dans un sql dynamique la lecture de ses enregistrements et la propagation vers les tables TD(m)
 
stmt := '
DECLARE
m integer :=0;
BEGIN
 for cursor c1 in (select .... from TS1) LOOP -- syntaxe 'logique'
   -- traitement de plusieurs table TD(m) cf. paramétrage
   for m in tcib_tab.FIRST...tcib_tab.LAST LOOP
     -- KO pour la ligne qui suit :
     UPDATE '||tcib_tab(m).TAB_BD|| ' SET '|| tcib_tab(m).CHAMPS_SET||' WHERE '||tcib_tab(m).CLAUSE_PK||';'
     -- 
   END LOOP
 END LOOP
END;
';
execute immediate stmt;
END;
Malheureusement , le tableau de paramétrage n'est pas reconnu lors de la compilation.
Erreur de compilation : "Erreur(362,40): PLS-00201: l'identificateur 'M' doit être déclaré"

D'avance merci de votre attention et de vos conseils.
Comment passer les valeurs d'un VARRAY au sql dynamique ?
Cdlt