sql - 如何获取包含所有 dba 软件包描述的列表

我需要在我的应用程序中概述您可以在数据库的 sql 或 pl/sql 语句中使用的所有包。 我需要包名称和过程/函数及其描述。

例如:

dbms_output:提供一些输出的包

dbms_output.put_line:将一些输出返回到服务器输出的过程

这可以使用普通选择来完成吗?

我已经尝试了以下方法,它给了我数据但没有描述,也没有程序包的过程和/或功能:

SELECT DISTINCT Owner, Object_Type, Object_Name FROM DBA_Objects_AE
     WHERE Owner IN (
       'SYS', 'OUTLN', 'SYSTEM', 'CTXSYS', 'DBSNMP',
       'LOGSTDBY_ADMINISTRATOR', 'ORDSYS',
       'ORDPLUGINS', 'OEM_MONITOR', 'WKSYS', 'WKPROXY',
       'WK_TEST', 'WKUSER', 'MDSYS', 'LBACSYS', 'DMSYS',
       'WMSYS', 'OLAPDBA', 'OLAPSVR', 'OLAP_USER',
       'OLAPSYS', 'EXFSYS', 'SYSMAN', 'MDDATA',
       'SI_INFORMTN_SCHEMA', 'XDB', 'ODM')
     AND Object_Type IN ('PACKAGE', 'TYPE')
     ORDER BY Owner, Object_Type, Object_Name;


select *
from all_objects
where object_type = 'PACKAGE';

最佳答案

您可以从all_procedures 中获取包的过程和函数以及对象类型(成员函数):

select ao.owner, ao.object_type, ao.object_name, ap.procedure_name
from all_objects ao
left join all_procedures ap
on ap.owner = ao.owner
and ap.object_name = ao.object_name
where ao.owner in (
  'SYS', 'OUTLN', 'SYSTEM', 'CTXSYS', 'DBSNMP',
  'LOGSTDBY_ADMINISTRATOR', 'ORDSYS',
  'ORDPLUGINS', 'OEM_MONITOR', 'WKSYS', 'WKPROXY',
  'WK_TEST', 'WKUSER', 'MDSYS', 'LBACSYS', 'DMSYS',
  'WMSYS', 'OLAPDBA', 'OLAPSVR', 'OLAP_USER',
  'OLAPSYS', 'EXFSYS', 'SYSMAN', 'MDDATA',
  'SI_INFORMTN_SCHEMA', 'XDB', 'ODM')
and ao.object_type in ('PACKAGE', 'TYPE')
order by ao.owner, ao.object_type, ao.object_name, ap.procedure_name;

OWNER                          OBJECT_TYPE         OBJECT_NAME                    PROCEDURE_NAME               
------------------------------ ------------------- ------------------------------ ------------------------------
DBSNMP                         PACKAGE             DM_FMTLIB                      MGMT_DM_GEN_AC                 
DBSNMP                         PACKAGE             DM_FMTLIB                      MGMT_DM_GEN_AC_FH              
DBSNMP                         PACKAGE             DM_FMTLIB                      MGMT_DM_GEN_AC_FS              
DBSNMP                         PACKAGE             DM_FMTLIB                      MGMT_DM_GEN_ANYC               
...

如果你想显示参数,如果只是为了区分重载过程,你可以加入all_arguments。但不确定这将如何管理:

select ao.object_type
  ||' '|| ao.owner ||'.'|| ao.object_name
  || case when ap.procedure_name is not null then
    '.'|| ap.procedure_name
    || case when count(aa.argument_name) > 0 then
      '('|| listagg(aa.argument_name, ',')
        within group (order by position) ||')'
    end
  end as object_info
from all_objects ao
left join all_procedures ap
on ap.owner = ao.owner
and ap.object_name = ao.object_name
and ap.object_id = ao.object_id
left join all_arguments aa
on aa.owner = ap.owner
and aa.object_name = ap.procedure_name
and aa.object_id = aa.object_id
and aa.subprogram_id = ap.subprogram_id
where ao.owner in (
  'SYS', 'OUTLN', 'SYSTEM', 'CTXSYS', 'DBSNMP',
  'LOGSTDBY_ADMINISTRATOR', 'ORDSYS',
  'ORDPLUGINS', 'OEM_MONITOR', 'WKSYS', 'WKPROXY',
  'WK_TEST', 'WKUSER', 'MDSYS', 'LBACSYS', 'DMSYS',
  'WMSYS', 'OLAPDBA', 'OLAPSVR', 'OLAP_USER',
  'OLAPSYS', 'EXFSYS', 'SYSMAN', 'MDDATA',
  'SI_INFORMTN_SCHEMA', 'XDB', 'ODM')
and ao.object_type in ('PACKAGE', 'TYPE')
and ao.object_name = 'DBMS_OUTPUT'
group by ao.object_type, ao.owner, ao.object_name, ap.procedure_name,
  ao.object_id, ap.subprogram_id
order by ao.owner, ao.object_type, ao.object_name, ap.procedure_name;

我限制只显示 DBMS_OUTPUT 作为示例:

OBJECT_INFO
-----------------------------------------------------------------------------------
PACKAGE SYS.DBMS_OUTPUT.DISABLE
PACKAGE SYS.DBMS_OUTPUT.ENABLE(BUFFER_SIZE,LOG_TYPE,LOG_TARGET,LOG_LEVEL)
PACKAGE SYS.DBMS_OUTPUT.GET_LINE(FILE,ID,LINE,BUFFER,DATATYPE,STATUS,BYTE_MODE,LEN)
PACKAGE SYS.DBMS_OUTPUT.GET_LINES(LINES,NUMLINES)
PACKAGE SYS.DBMS_OUTPUT.GET_LINES(LINES,NUMLINES)
PACKAGE SYS.DBMS_OUTPUT.NEW_LINE
PACKAGE SYS.DBMS_OUTPUT.PUT(A)
PACKAGE SYS.DBMS_OUTPUT.PUT_LINE(A)
PACKAGE SYS.DBMS_OUTPUT

或者显示函数的返回类型:

select ao.object_type
  ||' '|| ao.owner ||'.'|| ao.object_name
  || case when ap.procedure_name is not null then
    '.'|| ap.procedure_name
    || case when count(aa.argument_name) > 0 then
      '('|| listagg(aa.argument_name, ',')
        within group (order by position) ||')'
    end
    || case when min(aa.position) = 0 then ' RETURN '
      || max(case when position = 0 then aa.pls_type end) end
  end as object_info
...

对于 DBMS_RANDOM:

PACKAGE SYS.DBMS_RANDOM.INITIALIZE(VAL)
PACKAGE SYS.DBMS_RANDOM.NORMAL RETURN NUMBER
PACKAGE SYS.DBMS_RANDOM.RANDOM RETURN BINARY_INTEGER
PACKAGE SYS.DBMS_RANDOM.SEED(VAL)
PACKAGE SYS.DBMS_RANDOM.SEED(VAL)
PACKAGE SYS.DBMS_RANDOM.STRING(OPT,LEN) RETURN VARCHAR2
PACKAGE SYS.DBMS_RANDOM.TERMINATE
PACKAGE SYS.DBMS_RANDOM.VALUE RETURN NUMBER
PACKAGE SYS.DBMS_RANDOM.VALUE(LOW,HIGH) RETURN NUMBER
PACKAGE SYS.DBMS_RANDOM

显然,您可以根据需要格式化信息,使用数据类型而不是参数名称等,所以这只是一个起点。

我怀疑在任何地方都有描述甚至评论。这为您提供了很多可以选择复选框并为其编写描述的东西。引用the documentation似乎更明智,但取决于你想用这些信息做什么。

https://stackoverflow.com/questions/23545184/

相关文章:

laravel-5 - "entrust"命名空间中没有定义命令

xslt-2.0 - XSL :FO avoid Space between Table Cells

gcc - ARM ;内联汇编;使用暂存器;

amazon-web-services - CloudFormation 模板中元数据部分的用途是什

r - 如何使用 ggplotly 绘制 3D 图形?

haskell - 如何在 Haskell 中产生并发计算?

google-chrome-extension - 卸载 Chrome 扩展时打开新窗口

r - 添加一列,其中包含具有最大频率的对象的值

asp.net-mvc - EF 核心和 Azure

angularjs - 输入文本内的 Angular 清除图标