Bonjour à tous.
J'ai un problème d'appel de fonction sur un utilisateur variable.
le problème est issu d'un projet conséquent mais se résume à ceci
plusieurs utilisateurs ont défini la fonction suivante:
1 2 3 4 5
| create or replace function reg(id varchar2) return integer IS
begin
insert into testrc (id) values ('''||id||''');
return 1;
end; |
moi, je doit créer une procedure equivalente à unUser.reg(USER);
j'ai essayé ceci, mais ca ne fonctionne pas, je reçois un "ORA-00900: invalid SQL statement"
1 2 3 4 5 6 7 8 9 10 11 12
| CREATE OR REPLACE PROCEDURE enregistrer(unUser varchar2) IS
moi varchar2(50);
n integer;
ordre varchar2(100);
BEGIN
select USER into moi from dual;
execute immediate unUser||'.reg('''||moi||''')' into n;
--ou
execute immediate 'n:= '||unUser||'.reg('''||moi||''')';
dbms_output.put_line(n);
END; |
par ailleur, le code suivant plante aussi, mais a cause de "can't do DML order in select"
execute immediate 'select '||unUser||'.reg('''||moi||''') from dual' into n;
si je fait simplement n:=user1.reg('usermoi'); ca fonctionne, mais ca n'est pas la procédure souhaitée
Je parie que la solution est simple, mais je ne la trouve pas.
EDIT:
Comme prédit la solution est "simple": il suffit de faire une transaction autonome
1 2 3 4 5 6 7
| create or replace function reg(id varchar2) return integer IS
pragma autonomous_transaction;
begin
insert into testrc (id) values ('''||id||''');
commit;
return 1;
end; |
cependant, s'il existe une solution ne demandant pas de modifier reg, ca serait mieux. (en principe, ce n'est pas à moi d'écrire reg)
Partager