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

本文介绍了一个在Oracle后端程序中用于获取调用位置存储过程名称的函数,该函数可以在Procedure、Function和Trigger中正确获取调用程序名称,并且支持同服务器不同账号之间的调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在實際應用的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中調用該函數,就可以知道自己叫什麼名稱了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值