mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
66 lines
2.1 KiB
MySQL
66 lines
2.1 KiB
MySQL
CREATE OR REPLACE PROCEDURE who_called_me
|
|
( owner OUT VARCHAR2,
|
|
name OUT VARCHAR2,
|
|
lineno OUT NUMBER,
|
|
caller_t OUT VARCHAR2 ,
|
|
depth NUMBER DEFAULT 1
|
|
)
|
|
AUTHID DEFINER
|
|
AS
|
|
--depth based version of who_called_me from asktom
|
|
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 ( 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 = (2+depth) ) then
|
|
lineno := to_number(substr( line, 13, 8 ));
|
|
line := substr( line, 23 ); --set to rest of line .. change from 21 to 23
|
|
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 := ltrim(rtrim(upper(substr( line, 1, n-1 ))));
|
|
else
|
|
caller_t := 'TRIGGER';
|
|
end if;
|
|
|
|
line := substr( line, nvl(n,1) );
|
|
n := instr( line, '.' );
|
|
owner := ltrim(rtrim(substr( line, 1, n-1 )));
|
|
name := LTRIM(RTRIM(SUBSTR( LINE, N+1 )));
|
|
exit;
|
|
END IF;
|
|
END IF;
|
|
END LOOP;
|
|
END;
|
|
/
|
|
|