프로시저 실행중에 자기 자신의 이름을 가져오는 방법이 있나요? 0 2 6,471

by DDRCHO [PL/SQL] 프로시저 실행중 PL/SQL [2011.02.01 11:10:51]


우선 모든 분들 새해복 많이 받으시길 바랍니다. ^^

제가 프로시저들을 실행시키면서 실행 LOG를 기록하려고 하는데
실행중인 프로시저명을 하드코딩이 아닌 방법으로 가져올 수 있는지 궁금해서 여쭙니다.

예를 들어 프로시저명이 PROC_1인 프로시저를 실행한다고 했을때.
이 PROC_1 내부 코드에서 "PROC_1"이란 프로시저명을 도출할 수 있는지요.

하드코딩으로 하자니 대소문자, 괄호, 오타등의 문제로 쌓인 LOG에 대한 활용이
쉽지 않고, 프로시저명 변경시 같이 변경해줘야하는 단점이 있네요...

읽어주셔서 감사합니다.
좋은 하루 되세요.
by park1q [2011.02.01 11:30:10]
dbms_utility.format_call_stack 를 적당히 파싱해서 사용하면..될것 같습니다.

아래 참고 하세요.
create or replace procedure who_called_me( owner out varchar2,
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, 13, 6 ));
line := substr( line, 21 );
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 )));
end if;
end if;
end loop;
end;
/


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



create or replace procedure demo
as
begin
dbms_output.put_line( who_am_i );
end;
/


########### test
SQL> SET SERVEROUT ON
SQL> exec demo;
SYSTEM.DEMO

출처 : http://tkyte.blogspot.com/2009/10/httpasktomoraclecomtkytewhocalledme.html

by camela [2011.02.01 13:28:46]
흠...프로시저명 가져오는 방법이 있었네요.
질문하신 분처럼 저두 예전 배치 프로그램 작성하며 로그 저장할때 프로시저명 가져오는 방법이 있으면 좋겠다고 생각했었는데...그때는 그냥 하드코딩했었죠..ㅎㅎ
유용하게 쓸 수 있겠네요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입