programing

Oracle PL/SQL에서 호출 프로시저 또는 함수의 이름을 가져옵니다.

telebox 2023. 7. 1. 08:33
반응형

Oracle PL/SQL에서 호출 프로시저 또는 함수의 이름을 가져옵니다.

PL/SQL 프로시저(이 경우 오류를 기록하는 프로시저)가 이를 호출한 함수/프로시저의 이름을 가져올 수 있는지 아는 사람이 있습니까?

분명히 이름을 매개 변수로 전달할 수 있지만, 시스템 호출이나 정보를 얻기 위한 무언가를 하면 좋을 것입니다. 절차/함수에서 호출되지 않으면 null이나 무언가를 반환할 수 있습니다.

이에 대한 방법이 없다면 괜찮습니다. 가능한지 궁금할 뿐입니다(검색 결과 아무것도 나오지 않습니다).

라는 패키지가 있습니다.OWA_UTIL(이전 버전의 데이터베이스에서는 기본적으로 설치되지 않음).이것은 방법이 있습니다.WHO_CALLED_ME()OWNER, OBJECT_NAME, LINE_NO 및 CALLER_TYPE을 반환합니다.호출자가 패키지 프로시저인 경우 프로시저 이름이 아닌 패키지 이름을 반환합니다.이 경우 프로시저 이름을 가져올 방법이 없습니다. 프로시저 이름이 오버로드될 수 있기 때문에 그다지 유용하지는 않습니다.

자세히 알아보세요.


10gR2 이후에는 또한 있습니다.$$PLSQL_UNIT특수 기능. OBJECT NAME(객체 이름)도 반환됩니다(즉, 패키지 미포장 프로시저).

저는 이 포럼을 찾았습니다: http://www.orafaq.com/forum/t/60583/0/ .그것은 당신이 보고 있는 것일 수도 있습니다.

기본적으로 제공된 Oracle을 사용할 수 있습니다.dbms_utility.format_call_stack:

scott@ORA92> CREATE TABLE error_tab
  2    (who_am_i      VARCHAR2(61),
  3     who_called_me VARCHAR2(61),
  4     call_stack    CLOB)
  5  /

Table created.

scott@ORA92> 
scott@ORA92> CREATE OR REPLACE PROCEDURE d
  2  AS
  3    v_num      NUMBER;
  4    v_owner    VARCHAR2(30);
  5    v_name     VARCHAR2(30);
  6    v_line     NUMBER;
  7    v_caller_t VARCHAR2(100);
  8  BEGIN
  9    select to_number('a') into v_num from dual; -- cause error for testing
 10  EXCEPTION
 11    WHEN OTHERS THEN
 12      who_called_me (v_owner, v_name, v_line, v_caller_t);
 13      INSERT INTO error_tab
 14      VALUES (who_am_i,
 15          v_owner || '.' || v_name,
 16          dbms_utility.format_call_stack);
 17  END d;
 18  /

Procedure created.

scott@ORA92> SHOW ERRORS
No errors.
scott@ORA92> CREATE OR REPLACE PROCEDURE c
  2  AS
  3  BEGIN
  4    d;
  5  END c;
  6  /

Procedure created.

scott@ORA92> CREATE OR REPLACE PROCEDURE b
  2  AS
  3  BEGIN
  4    c;
  5  END b;
  6  /

Procedure created.

scott@ORA92> CREATE OR REPLACE PROCEDURE a
  2  AS
  3  BEGIN
  4    b;
  5  END a;
  6  /

Procedure created.

scott@ORA92> execute a

PL/SQL procedure successfully completed.

scott@ORA92> COLUMN who_am_i FORMAT A13
scott@ORA92> COLUMN who_called_me FORMAT A13
scott@ORA92> COLUMN call_stack    FORMAT A45
scott@ORA92> SELECT * FROM error_tab
  2  /

WHO_AM_I      WHO_CALLED_ME CALL_STACK
------------- ------------- ---------------------------------------------
SCOTT.D       SCOTT.C       ----- PL/SQL Call Stack -----
                              object      line  object
                              handle    number  name
                            6623F488         1  anonymous block
                            66292138        13  procedure SCOTT.D
                            66299430         4  procedure SCOTT.C
                            6623D2F8         4  procedure SCOTT.B
                            6624F994         4  procedure SCOTT.A
                            66299984         1  anonymous block


scott@ORA92>

기본적으로 변수를 정의하고 유틸리티 메서드로 호출하여 값을 채우기만 하면 됩니다.

create or replace procedure some_test_proc (p_some_int int) 
is
    owner_name VARCHAR2 (100);
    caller_name VARCHAR2 (100);
    line_number NUMBER;
    caller_type VARCHAR2 (100);
begin
    ....
    OWA_UTIL.WHO_CALLED_ME (owner_name,caller_name,line_number,caller_type);
    -- now you can insert those values along with systimestamp into a log file
    ....
end;

언급URL : https://stackoverflow.com/questions/7273982/get-the-name-of-the-calling-procedure-or-function-in-oracle-pl-sql

반응형