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;
 | 
						|
/
 | 
						|
 |