You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Oracle包内当前正在执行的存储过程名称?

How to Get the Name of the Currently Executing Procedure Inside an Oracle Package?

当然可以实现!在Oracle中,我们有几种可靠的方法来获取包内当前正在执行的存储过程名称,下面根据你的Oracle版本给你具体的实现方案和示例代码:


对于Oracle 12c及更高版本(推荐)

从Oracle 12c开始,Oracle提供了UTL_CALL_STACK这个专门用于处理调用栈的内置包,用它可以更简洁、可靠地获取当前子程序名称:

create or replace package test_pkg as 
    procedure proc1; 
end test_pkg; 
/

create or replace package body test_pkg as 
    procedure proc1 is 
        v_proc_name varchar2(100);
        v_full_name varchar2(200);
    begin
        -- 获取当前执行的过程名(仅过程名称)
        v_proc_name := UTL_CALL_STACK.SUBPROGRAM(UTL_CALL_STACK.CALL_DEPTH)(2);
        
        -- 如果需要完整的"包名.过程名"格式
        v_full_name := UTL_CALL_STACK.SUBPROGRAM(UTL_CALL_STACK.CALL_DEPTH)(1) || '.' || v_proc_name;
        
        -- 输出结果(需要开启DBMS_OUTPUT才能看到)
        DBMS_OUTPUT.PUT_LINE('当前执行的过程名: ' || v_proc_name);
        DBMS_OUTPUT.PUT_LINE('完整标识: ' || v_full_name);
    end proc1; 
end test_pkg; 
/

说明:

  • UTL_CALL_STACK.CALL_DEPTH返回当前调用栈的深度(即当前执行位置在调用链中的层级)
  • UTL_CALL_STACK.SUBPROGRAM(n)返回第n层调用的子程序信息,这是一个数组:
    • 数组第1个元素是包名(比如TEST_PKG)
    • 数组第2个元素就是当前的过程名(比如PROC1)

对于Oracle 11g及更早版本

如果你的Oracle版本低于12c,可以通过解析DBMS_UTILITY.FORMAT_CALL_STACK返回的调用栈文本信息来提取过程名:

create or replace package test_pkg as 
    procedure proc1; 
end test_pkg; 
/

create or replace package body test_pkg as 
    procedure proc1 is 
        v_call_stack varchar2(4000);
        v_proc_name varchar2(100);
        v_start_idx number;
        v_end_idx number;
    begin
        -- 获取格式化的调用栈文本
        v_call_stack := DBMS_UTILITY.FORMAT_CALL_STACK;
        
        -- 解析文本提取过程名(这里假设包名为TEST_PKG,可根据实际调整)
        v_start_idx := INSTR(v_call_stack, 'TEST_PKG.', 1, 1) + LENGTH('TEST_PKG.');
        v_end_idx := INSTR(v_call_stack, CHR(10), v_start_idx, 1);
        
        if v_start_idx > LENGTH('TEST_PKG.') and v_end_idx > v_start_idx then
            v_proc_name := SUBSTR(v_call_stack, v_start_idx, v_end_idx - v_start_idx);
            DBMS_OUTPUT.PUT_LINE('当前执行的存储过程名称: ' || v_proc_name);
        end if;
    end proc1; 
end test_pkg; 
/

说明:

  • DBMS_UTILITY.FORMAT_CALL_STACK返回的是格式化的调用栈文本,我们通过字符串函数定位包名后的过程名部分
  • 这种方法依赖于调用栈的输出格式,如果有复杂的嵌套调用,可能需要调整解析逻辑

测试方法

要查看输出结果,需要先开启DBMS_OUTPUT,比如在SQL*Plus或SQL Developer中执行:

SET SERVEROUTPUT ON;
EXEC test_pkg.proc1;

执行后你就能看到当前执行的存储过程名称啦!

内容的提问来源于stack exchange,提问作者sqlpractice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:53:10