您的位置:首页 > 数据库 > Oracle

Oracle PL/SQL中取得當前程式名稱

2010-08-12 13:26 573 查看
在實際應用的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中調用該函數,就可以知道自己叫什麼名稱了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: