Bonjour,
Je souhaiterai savoir si à l'intérieur d'une procédure stockée, il est possible de récupérer le nom de la procédure appelante (sans passer le nom de la proc en paramètre bien sur).
Je suis sous Oracle 8i
Version imprimable
Bonjour,
Je souhaiterai savoir si à l'intérieur d'une procédure stockée, il est possible de récupérer le nom de la procédure appelante (sans passer le nom de la proc en paramètre bien sur).
Je suis sous Oracle 8i
J'avais trouvé ça à un moment (mais je ne sais plus où)
Code:
1
2
3
4
5
6
7
8
9
10
11 CREATE OR REPLACE FUNCTION WHO_AM_I RETURN VARCHAR2 IS l_owner VARCHAR2(30); l_name VARCHAR2(30); l_lineno NUMBER; l_type VARCHAR2(30); BEGIN who_called_me(l_owner, l_name, l_lineno, l_type); RETURN l_owner || '.' || l_name; END; /
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 CREATE OR REPLACE PROCEDURE WHO_CALLED_ME( owner OUT VARCHAR2, v_name OUT VARCHAR2, lineno OUT NUMBER, caller_t OUT VARCHAR2 ) AS call_stack VARCHAR2(4096) DEFAULT DBMS_UTILITY.FORMAT_CALL_STACK; n NUMBER; found_stack BOOLEAN DEFAULT FALSE; line VARCHAR2(255); cnt NUMBER := 0; BEGIN LOOP n := INSTR(call_stack, CHR(10)); EXIT WHEN (cnt = 3 OR n IS NULL OR n = 0); line := SUBSTR(call_stack, 1, n-1 ); call_stack := SUBSTR(call_stack, n+1); IF NOT found_stack THEN IF line LIKE '%handle%number%name%' THEN found_stack := TRUE; END IF; ELSE cnt := cnt + 1; -- cnt = 1 is ME -- cnt = 2 is MY Caller -- cnt = 3 is Their Caller IF cnt = 3 THEN lineno := TO_NUMBER(SUBSTR(line, 10, 10)); line := SUBSTR(line, 22 ); IF line LIKE 'pr%' THEN n := LENGTH('procedure '); ELSIF line LIKE 'fun%' THEN n := LENGTH('function '); ELSIF line LIKE 'package body%' THEN n := LENGTH('package body '); ELSIF line LIKE 'pack%' THEN n := LENGTH('package '); ELSIF line LIKE 'anonymous%' THEN n := LENGTH('anonymous block '); ELSE n := NULL; END IF; IF n IS NOT NULL THEN caller_t := TRIM(UPPER(SUBSTR(line, 1, n-1 ))); ELSE caller_t := 'TRIGGER'; END IF; line := SUBSTR(line, NVL(n,1) ); n := INSTR(line, '.' ); owner := TRIM(SUBSTR(line, 1, n-1)); v_name := TRIM(SUBSTR(line, n+1)); END IF; END IF; END LOOP; END; /
J'ai une erreur de conversion de numérique en chaine à l'execution mais je creuserai ça lundi
Merci beaucoup !
Sur le developpez.net, peut-être ? :aie: http://www.developpez.net/forums/d90...nd/#post599323
Sinon, depuis la 10g au moins, il y a owa_util.who_called_me.
who_am_I et who_called_me c'est du AskTom.
Je n'ai pas dit le contraire (et je n'ai surtout pas la prétention de les avoir écrite moi-même), j'ai juste supposé comme McM est un membre assidu de developpez.net, qu'il l'avait certainement vu sur ce site ;)
Quoique Tom l'a peut-être repris sur developpez.net vu que son billet est plus récent... :aie:
Pas d'accusation de plagiat c'était juste une précision.
Citation:
...
Quoique Tom l'a peut-être repris sur developpez.net vu que son billet est plus récent... :aie:
C'est une reprise du http://asktom.oracle.com/tkyte/ qui date dépuis 2000 ou 2001 il me semble.
Citation:
Merci à tous!
L'erreur que j'avais à l'exécution était due au fait que je testai sur une base 10g et que l'object handle n'a apparemment pas la même longueur qu'en 8i. En 8i ça fonctionne parfaitement.
Par contre, il y a une différence de fonctionnement entre la 8i et la 10g lorsque j'appelle des procédures depuis un client (Forms en l'occurence) : en 10g, la focntion Dbms_Utility.format_call_stack me ramène bien toujours les bonnes infos, alors qu'en 8i, elle ne me ramène rien... En revanche aucun problème lorsque je lance directement une procédure stockée depuis SqlPlus...