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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?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...![]()
Pas d'accusation de plagiat c'était juste une précision.
...
Quoique Tom l'a peut-être repris sur developpez.net vu que son billet est plus récent...![]()
C'est une reprise du http://asktom.oracle.com/tkyte/ qui date dépuis 2000 ou 2001 il me semble.
All of the content that used to be located at http://asktom.oracle.com/tkyte/ is now here:
Partager