【问题标题】:Oracle -trace and report on all function names and procedure names called in all a packageOracle - 跟踪并报告所有包中调用的所有函数名称和过程名称
【发布时间】:2020-11-07 19:15:29
【问题描述】:

我正在使用 Oracle 11.2,并且想查看在包中调用的函数和过程的名称。我已经尝试过 DBMS.TRACE,但我看不到函数和过程名称——只有 sql 或包名称。我该怎么做?

【问题讨论】:

  • 查看包源代码的最简单方法是使用 SQL Developer 之类的工具。
  • 尝试使用USER_DEPENDENCIESALL_DEPENDENCIES 视图。抱歉,我只能提供这些信息 - 我目前没有 Oracle 访问权限。
  • 您是否正在寻找所有依赖项的列表,以进行代码分析?或者您是否正在寻找调用程序的次数以进行性能调整?如果这是为了调优,您可能需要查看 dbms_profiler 或分层分析器。一些 IDE 甚至为它们提供了用户界面。

标签: oracle plsql


【解决方案1】:

如果你想列出属于一个包的所有过程/函数,你应该使用字典视图 ALL_PROCEDURES。

例子

 SQL> create or replace package cpl_rep.my_test_pkg
 as
 procedure testprc ( p1 number );
 function testfun ( p1 number ) return number;
 end;
 /

Package created.

SQL> create or replace package body cpl_rep.my_test_pkg
as
procedure testprc ( p1 number )
is
begin
null;
end testprc;
function testfun ( p1 number ) return number
is
begin
return null;
end testfun;
end;
/

Package body created.

SQL> desc all_procedures

SQL> desc all_procedures
 Name                                                                          Null?    Type
 ----------------------------------------------------------------------------- -------- ----------------------------------------------------
 OWNER                                                                                  VARCHAR2(128)
 OBJECT_NAME                                                                            VARCHAR2(128)
 PROCEDURE_NAME                                                                         VARCHAR2(128)
 OBJECT_ID                                                                              NUMBER
 SUBPROGRAM_ID                                                                          NUMBER
 OVERLOAD                                                                               VARCHAR2(40)
 OBJECT_TYPE                                                                            VARCHAR2(13)
 AGGREGATE                                                                              VARCHAR2(3)
 PIPELINED                                                                              VARCHAR2(3)
 IMPLTYPEOWNER                                                                          VARCHAR2(128)
 IMPLTYPENAME                                                                           VARCHAR2(128)
 PARALLEL                                                                               VARCHAR2(3)
 INTERFACE                                                                              VARCHAR2(3)
 DETERMINISTIC                                                                          VARCHAR2(3)
 AUTHID                                                                                 VARCHAR2(12)
 RESULT_CACHE                                                                           VARCHAR2(3)
 ORIGIN_CON_ID                                                                          NUMBER

SQL> select owner,object_name,procedure_name,object_id,subprogram_id, object_type
     from all_procedures where owner = 'CPL_REP' and object_name = 'MY_TEST_PKG' ;

OWNER                OBJECT_NAME                    PROCEDURE_NAME                  OBJECT_ID SUBPROGRAM_ID OBJECT_TYPE
-------------------- ------------------------------ ------------------------------ ---------- ------------- -------------
CPL_REP              MY_TEST_PKG                    TESTFUN                           1582551             2 PACKAGE
CPL_REP              MY_TEST_PKG                    TESTPRC                           1582551             1 PACKAGE
CPL_REP              MY_TEST_PKG                                                      1582551             0 PACKAGE

但是,Oracle 没有名为 ALL_FUNCTIONS 的视图,因此属于一个包的所有对象将始终出现在 ALL_PROCEDURES 中。

【讨论】:

    【解决方案2】:

    我认为 DBMS_PROFILER 是你想要的 - 我认为它仍然存在 11g。

    我从 Oracle 8i 开始就没有使用过它,但是你从内存中将代码包装在对包的调用周围,然后查询 plsql_profiler_data

    例如:

    BEGIN
       dbms_profiler.start_profiler ('MYTEST');
       MYPACKAGE.MYPROC;
       dbms_profiler.flush_data();
       bms_profiler.stop_profiler();
    END;
    

    现在查询PLSQL_PROFILER_DATA。这给出了源单元和行号,所以你需要加入ALL_SOURCE 或者ALL_PROCEDURES 来获取实际代码。

    【讨论】:

      猜你喜欢
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 2011-10-16
      相关资源
      最近更新 更多