Bonjour tout le monde
je suis sous Oracle 10g.
je viens de solliciter de votre compréhension sur :
Dans une procédure PL/SQL, comment puis je récupérer, d'une façon dynamique, le nom de la procédure courante en moment de son exécution?
Version imprimable
Bonjour tout le monde
je suis sous Oracle 10g.
je viens de solliciter de votre compréhension sur :
Dans une procédure PL/SQL, comment puis je récupérer, d'une façon dynamique, le nom de la procédure courante en moment de son exécution?
Avec le call_stack peut être ? Récupérer la 4ème ligne
RetourCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 CREATE OR REPLACE PROCEDURE wmc2 IS BEGIN dbms_output.put_line('2:format_call_stack:'|| DBMS_UTILITY.format_call_stack); END; CREATE OR REPLACE PROCEDURE wmc1 IS BEGIN dbms_output.put_line('1:format_call_stack:'|| DBMS_UTILITY.format_call_stack); wmc2; dbms_output.put_line('1:format_call_stack:'|| DBMS_UTILITY.format_call_stack); wmc2; END;
En 12, il existe visiblement le package UTL_CALL_STACKCode:
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 1:format_call_stack:----- PL/SQL Call Stack ----- object line object handle number name 0x7863e770 4 procedure MC.WMC1 0x79eb7cb0 1 anonymous block 2:format_call_stack:----- PL/SQL Call Stack ----- object line object handle number name 0x7fd393b0 4 procedure MC.WMC2 0x7863e770 5 procedure MC.WMC1 0x79eb7cb0 1 anonymous block 1:format_call_stack:----- PL/SQL Call Stack ----- object line object handle number name 0x7863e770 6 procedure MC.WMC1 0x79eb7cb0 1 anonymous block 2:format_call_stack:----- PL/SQL Call Stack ----- object line object handle number name 0x7fd393b0 4 procedure MC.WMC2 0x7863e770 7 procedure MC.WMC1 0x79eb7cb0 1 anonymous block
Et ce post : http://stackoverflow.com/questions/2...ect-nameprocid
Merci, McM, d'avoir me donner la tête du file.
mais je ne veux que le nom de la procédure exécutée. est qu'il y a un moyen pour le faire?
Il va falloir coder Islamov :)
Voici un exemple qui récupère la ligne de l'appelant de la fonction whoami
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 CREATE OR REPLACE FUNCTION whoami RETURN VARCHAR2 IS c VARCHAR2(2001); BEGIN c := DBMS_UTILITY.format_call_stack ||CHR(10); c := SUBSTR(c, INSTR(c, CHR(10), 1, 4)+1); RETURN SUBSTR(c, 22, INSTR(c, CHR(10))-22); END; CREATE OR REPLACE PROCEDURE wmc2 IS BEGIN dbms_output.put_line('2:'|| whoami); END; CREATE OR REPLACE PROCEDURE wmc1 IS BEGIN dbms_output.put_line('1:'|| whoami); wmc2; dbms_output.put_line('1:'|| whoami); wmc2; END;
Code:
1
2
3
4 1: procedure MC.WMC1 2: procedure MC.WMC2 1: procedure MC.WMC1 2: procedure MC.WMC2
Merci McM d'avoir me répondu à ma préoccupation.
Utilisez $$PLSQL_UNIT
Code:
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 Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 SQL> SQL> CREATE OR REPLACE PROCEDURE wmc2 2 IS 3 BEGIN 4 dbms_output.put_line('2:'|| $$plsql_Unit); 5 END; 6 / Procedure created SQL> CREATE OR REPLACE PROCEDURE wmc1 2 IS 3 BEGIN 4 dbms_output.put_line('1:'|| $$plsql_Unit); 5 wmc2; 6 dbms_output.put_line('1:'|| $$plsql_Unit); 7 wmc2; 8 END; 9 / Procedure created SQL> set serveroutput on SQL> exec wmc1 1:WMC1 2:WMC2 1:WMC1 2:WMC2 PL/SQL procedure successfully completed SQL>
Merci Mnitu.
J'ai vu que pour les packages, ça donne le nom du package (pas de la fonction ou procédure) : https://community.oracle.com/thread/1042794
Et qu'on peut retrouver la ligne exacte avec $$plsql_line
Ca a évolué encore en 12c avec l'apparition du UTL_CALL_STACK qui permet maintenant d'obtenir le noms de procédures à l'intérieur des packages et autres informations.
Merci mnitu, c'est une information en plus, je ne peux pas l'utiliser car je suis sous la 10g.