Au fait, le
EXECUTE IMMEDIATE... INTO..
n’est utilisé que pour les requêtes ne ramenant qu’une ligne, alors que j'ai besoin de travailler avec un ensemble de lignes, puis les parcourir pour appliquer le filtre d'une manière unitaire.
Mon problème venait de la déclaration du Curseur. J'ai lu dans la documentation que seul le nom de la table ne peut pas être passé via un argument de substitution, et c'était bien mon cas.
Vu que je connais les deux tables qui vont être passées en paramètre, j'ai décidé de créer deux curseurs et travailler avec l'un ou l'autre en fonction de la table recue (IF..Then else-> pas génial je pense).
Concernant le SQL dynamique j'ai essayé la ligne aussi le
fetch selectCursor Bulk collect into contenuColonne;
mais ça ne marchait pas non plus. Voici mon code jusqu'à maintenant avec lequel j'au toujours de soucis:
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| PROCEDURE FiltrageInterne
(
COLONNE Varchar2
,NOMTABLE Varchar2
) AS
--PRAGMA AUTONOMOUS_TRANSACTION;
v_counter number:=0;
v_commit_update number:=0;
v_colonneCommande_aux VARCHAR2(4000);
v_update_remplace VARCHAR2(4000);
v_tab varchar2(100):=NOMTABLE;
v_col varchar2(100):=NOMTABLE;
contenuColonne CLOB;
CURSOR CursorLotCommandes (LC$columna in varchar2) IS select LC$columna from ax_fop_e_lotdecommandes;
CURSOR CursorLotRetour (LC$columna in varchar2) IS select LC$columna from ax_fop_e_lotretour;
BEGIN
if (NOMTABLE='AX_FOP_E_LOTDECOMMANDES') then
DBMS_OUTPUT.PUT_LINE('###LotdeCommandes###');
open CursorLotCommandes (v_col);
else
DBMS_OUTPUT.PUT_LINE('###LotRetour###');
open CursorLotRetour(v_col);
end if;
loop
if (NOMTABLE='AX_FOP_E_LOTDECOMMANDES') then
fetch CursorLotCommandes into contenuColonne;
else fetch CursorLotRetour into contenuColonne;
end if;
--fetch selectCursor Bulk collect into contenuColonne;
DBMS_OUTPUT.PUT_LINE(contenuColonne);
DBMS_OUTPUT.PUT_LINE(DBMS_LOB.getlength(contenuColonne));
v_commit_update:=v_commit_update+1;
v_counter:=v_counter+1;
v_colonneCommande_aux:=DBMS_LOB.SUBSTR(contenuColonne,4000,(4000*v_counter)+1);
... |
Maintenant la variable contenuColonne vaut le nom de table.
Partager