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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)