如何在不使用descripe子句的情况下描述ORACLE包?

如何在不使用descripe子句的情况下描述ORACLE包?,oracle,oracle11g,sqlplus,describe,Oracle,Oracle11g,Sqlplus,Describe,我一直在研究如何在不使用“descripe table/view;”的情况下描述表和视图条款我发现它可以用以下方法解决: SELECT column_name, data_type, data_length, data_precision, data_scale, nullable FROM all_tab_columns WHERE table_name = 'TABLE' 这在PHP这样的计算机语言中是完全可编程的,但我没有找到“descripe package_name”子句的解决方法

我一直在研究如何在不使用“descripe table/view;”的情况下描述表和视图条款我发现它可以用以下方法解决:

SELECT column_name, data_type, data_length, data_precision, data_scale, nullable
FROM all_tab_columns
WHERE table_name = 'TABLE'
这在PHP这样的计算机语言中是完全可编程的,但我没有找到“descripe package_name”子句的解决方法

我有以下想法(在SQL*PLUS中有一个假脱机):

但它不起作用:(.抛出以下错误:

ORA-00900:判决SQL no válida ORA-06512:en línea 12

当修改“x”变量时,如下所示:

x := 'BEGIN DESCRIBE '||item.OBJECT_NAME||'; END;';
我得到以下错误:

错误en línea 1:ORA-06550:línea 1,第16列:PLS-00103: 预期出现以下情况之一时遇到符号“BVGKFDCS”: :=.(@%;符号“:”替换为“BVGKFDCS”以 继续。ORA-06512:en línea 12

其中“BVGKFDCS”是我的模式的一个包的名称

提前谢谢

p.D.我想得到这样的东西(但每个包裹):

请注意,此输出不同于:

select * from user_source

您需要使用User\u Source、DBA\u Source或All\u Source。所有代码都存储在那里

select text 
from user_source
where name = 'procedure_name' 
order by line;

对象类型:函数、JAVA源代码、包体、过程、触发器、类型、类型体

这对您有用吗

SQL> SELECT DBMS_METADATA.GET_DDL('PACKAGE','EMP_PKG','SCOTT') FROM DUAL;

SQL> SELECT DBMS_METADATA.GET_DDL('PACKAGE_BODY','EMP_PKG','SCOTT') FROM DUAL;

SQL> show user
USER is "SYSTEM"
SQL>
SQL> l
  1* SELECT DBMS_METADATA.GET_DDL('PROCEDURE','P1','HR') FROM DUAL
SQL> /

DBMS_METADATA.GET_DDL('PROCEDURE','P1','HR')
-----------------------------------------------------------------------------

  CREATE OR REPLACE PROCEDURE "HR"."P1" ( p_id int) as
begin
   dbms_output.put

SQL>

descripe
execute immediate
中不起作用,因为它是SQL*Plus命令,而不是SQL或PL/SQL命令的一部分。它由客户端而不是服务器解释

获取任何数据库对象(包括包和包体)的源代码的最佳方法是@T.S.建议的
DBA_source
USER_source

数据库中的每种对象都有数据字典视图。当尝试为其他对象类型获取类似类型的数据时,应参考
字典
视图,该视图有助于对数据字典进行编目。例如,
用户源
字典
条目为:

TABLE_NAME  | COMMENTS
------------+------------------------------------------------
USER_SOURCE | Source of stored objects accessible to the user


过程名称是包规范的一部分。使用包名称和
type='package'
查询
all\u source
将返回规范,包括所有公共过程及其参数。

看看
USER\u procedures
。我怀疑这就是使用它时描述查询的内容在包、过程或函数上

编辑:很抱歉,还要合并
USER_ARGUMENTS
以列出每个子程序的参数。由于处理不同对象类型的方式不同,连接两个视图的逻辑并不明显。此查询看起来产生了合理的结果,但我没有仔细检查结果:

SELECT * FROM all_arguments A
JOIN all_procedures p
  ON ( ( p.object_type = 'PACKAGE' AND A.package_name = p.object_name AND A.object_name = p.procedure_name)
       OR
       ( p.object_type <> 'PACKAGE' AND A.package_name IS NULL AND A.object_name = p.object_name )
    )
  AND p.owner = A.owner
从所有参数中选择*A
加入所有的程序
ON((p.object\u type='PACKAGE'和A.PACKAGE\u name=p.object\u name和A.object\u name=p.procedure\u name)
或
(p.object_类型“PACKAGE”和A.PACKAGE_名称为NULL,A.object_名称=p.object_名称)
)
p.owner=A.owner

Hi可能重复,谢谢重播。不,这不是重复,因为descripe子句描述了该包中所有过程的参数。
descripe
DESC
不是子句。它是SQL*Plus命令。谢谢,现在我知道了:).在这里回答您好,谢谢您的回答。我没有任何过程名称,我只有包名称。@akolmogorov然后把您的包名称放在那里。我想,我清楚地公布了可以通过这种方式查询的对象类型是的,您是对的。您清楚地公布了需要什么类型的对象,并且您还指出了哪些表可以对此有所帮助It’这是一个变通办法。不幸的是,你建议的所有表格都不适合我。正是@Dave Acosta建议的组合适合我。非常感谢你的耐心和努力。来自墨西哥的问候。非常感谢你的回答。我刚刚意识到,你在上面解释的原因不适合我。问题是我没有过程名称,事实上,这正是我想要的(加上这些过程的数据类型输入和输出)。谢谢你的回答。我只是看了一下所有的\u过程,但它没有描述输入/输出参数及其类型。很抱歉-在*\u参数视图中添加了信息非常感谢,你是个天才!非常感谢你的回答。在这种情况下,SCOTT是为我的Oracle用户准备的,对吗?如果是这样,那就不行了k代表我:(但谢谢你的帮助。这让我犯了一个错误:'不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不“.其中BVGKFDCS是软件包,SATURN是我的ORACLE用户。我不确定为什么它对您不起作用。我添加了一个示例,它们是我们期望它起作用的方式--可能是试图查询文本的用户有正确的访问权限吗?”?
TABLE_NAME  | COMMENTS
------------+------------------------------------------------
USER_SOURCE | Source of stored objects accessible to the user
SELECT * FROM all_arguments A
JOIN all_procedures p
  ON ( ( p.object_type = 'PACKAGE' AND A.package_name = p.object_name AND A.object_name = p.procedure_name)
       OR
       ( p.object_type <> 'PACKAGE' AND A.package_name IS NULL AND A.object_name = p.object_name )
    )
  AND p.owner = A.owner