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中調用該函數,就可以知道自己叫什麼名稱了.
當需要識別調用的位置來作不同區分時,得到當前程式的名稱就很重要了.
雖然說我們在寫存儲過程的時候肯定會知道過程名稱,但這樣就只能使用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中調用該函數,就可以知道自己叫什麼名稱了.
相关文章推荐
- Oracle PL/SQL之NEXT_DAY - 取得下一个星期几所在的日期
- Oracle PL/SQL之NEXT_DAY - 取得下一个星期几所在的日期
- Oracle PL/SQL之NEXT_DAY - 取得下一个星期几所在的日期
- oracle中pl/sql记录与index-by表
- Oracle 11g Release 1 (11.1) 游标——在 PL/SQL 管理游标
- 《oracle pl/sql programming》 第10章 date/timestamp
- Oracle PL/SQL编程详解之三: PL/SQL流程控制语句
- PL/SQL ORACLE游标的使用方法
- Oracle PL/SQL编程之过程
- 不安装Oracle客户端,透过PL/SQL Developer连接Server DB
- Oracle PL/SQL之IN OUT NOCOPY
- Oracle PL/SQL编程之触发器(trigger)
- Win7 x64 PL/SQL 连接 Oralce 提示 Could not initialize "%ORACLE_HOME%\bin\oci.dll"
- pl/sql连接oracle
- 《oracle每日一练》免安装Oracle客户端使用PL/SQL
- 解决从pl/sql查看oracle的number(19)类型数据为科学计数法的问题
- oracle pl/sql之java中调用oracle有参存储过程
- ORACLE PL/SQL & SQL SERVER T-SQL
- oracle PL/SQL高级特性
- Oralce客户端Pl sql deveploer 连接oracle后表数据及注释乱码