在實際應用的Oracle后端程式中,有些模塊可能會經常需要在不同地方調用.
當需要識別調用的位置來作不同區分時,得到當前程式的名稱就很重要了.
雖然說我們在寫存儲過程的時候肯定會知道過程名稱,但這樣就只能使用HARDCODE,
為了統一程式書寫規範,減少HARDCODE的使用,我寫了一個函數用來取得調用位置的存儲過程名稱.
createor replace
function fun_getcallname(pi_user IN varchar2
default sys_context('USERENV','CURRENT_USER'))
returnvarchar2
--======================================================================
--功能說明:返回調用該函數程式的名稱.
--傳入參數:調用程式所在的帳號名稱,必須為大寫.
--返回值:調用程式的名稱.
--注意事項:
-- 1.該函數可以用在Procedure,Function,Trigger中,能正確得到調用程式名稱.
-- 2.在PACKAGE中使用時,只能得到PACKAGE名稱,不能取得實際的子過程名稱.
-- 3.該函數不支持跨DBLINK的調用.
-- 4.該函數支持同服務器中不同帳號之間的調用.
--開發人員:VnSoft 開發日期:20090929
--======================================================================
is
v_str varchar2(32767);
v_user varchar2(20);
v_end number;
begin
v_str := DBMS_UTILITY.FORMAT_CALL_STACK;
v_user := pi_user||'.';
v_end :=instrb(v_str,v_user,-1);
v_str :=substrb(v_str,v_end);
v_end :=instrb(v_str,'0x');
IF v_end=0 THEN
v_str := substrb(v_str,1,lengthb(v_str) - 1);
ELSE
v_str := substrb(v_str,1,v_end- 2);
END IF;
RETURNsubstrb(v_str,lengthb(v_user)+1);
END;
這個應該在Oracle 10g以上(含)版本才可以使用.
2012/07/20
后來在無意中找到一個Oracle自帶的函數:OWA_UTIL.WHO_CALLED_ME
利用這個函數可以取得當前Procedure的名稱.
先定義一個自定義的函數:
function fun_WHOCALLME
RETURN varchar2
IS
v_owner varchar2(100);
v_name varchar2(30);
v_lineno varchar2(30);
v_call varchar2(100);
BEGIN
OWA_UTIL.WHO_CALLED_ME(v_owner,v_name,v_lineno,v_call);
RETURN v_owner||'.'||v_name;
END;
然后在其它procedure中調用該函數,就可以知道自己叫什麼名稱了.