2014-05-08 92 views
2

我需要在应用程序中概述您可以在数据库的sql或pl/sql语句中使用的所有包。 我需要包名称和程序/功能与描述。如何获取包含所有dba包的描述的列表

因此,例如:

DBMS_OUTPUT:套餐给予一定的输出

DBMS_OUTPUT.PUT_LINE:过程返回一些输出SERVEROUTPUT

可以这样使用正常选择做什么?

我想已经这使我的数据,但没有说明,而不是程序,或功能包的下面:

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'; 
+2

难道你不能指出人们[包和类型参考文档](http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/toc.htm)(或[PDF版本](http://docs.oracle.com/cd/E11882_01/appdev.112/e40758.pdf))?你可以从数据字典中获得程序和函数,甚至是参数,但是我怀疑描述存储在任何地方。 –

+0

该手册中的概述是正确的:http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/intro.htm#i1010103 –

+0

我知道这些信息在手册中。但我有一个应用程序显示这些信息,他们需要复选框来说明是否使用它,这对于我构建的应用程序非常重要。而不是将手册中的所有信息输入到表格中,所以我想使用select语句。 – nightfox79

回答

3

可以得到该包的程序和功能,以及对象类型(成员函数),从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似乎更明智,但取决于您想要对信息做什么。

+0

非常感谢,看起来不错。如果没有人提出关于评论的答案,我会接受你的评论。 – nightfox79

1

也许你从Oracle获取HTML文档并用DOM解析器读取它。这可以防止你进行数百次“复制粘贴”。

相关问题