如何在不使用 DESCRIBE 子句的情况下描述 ORACLE 包?
Posted
技术标签:
【中文标题】如何在不使用 DESCRIBE 子句的情况下描述 ORACLE 包?【英文标题】:How to describe an ORACLE package without using DESCRIBE clause? 【发布时间】:2015-05-06 20:06:35 【问题描述】:我一直在研究如何在不使用“DESCRIBE table/view;”的情况下描述 TABLES 和 VIEWS条款。我发现可以使用以下方法解决它:
SELECT column_name, data_type, data_length, data_precision, data_scale, nullable
FROM all_tab_columns
WHERE table_name = 'TABLE'
这在 php 等计算机语言中是完全可编程的,但我没有找到“DESCRIBE package_name”子句的解决方法。
我有以下想法(但在带有线轴的 SQL*PLUS 中):
DECLARE
x VARCHAR2(50);
CURSOR cursorPaquetes IS
SELECT DISTINCT OBJECT_NAME
FROM ALL_OBJECTS
WHERE OBJECT_TYPE = 'PACKAGE' AND OWNER = 'SATURN';
BEGIN
FOR item IN cursorPaquetes LOOP
x := 'DESCRIBE '||item.OBJECT_NAME||';';
EXECUTE IMMEDIATE x;
END LOOP;
END;
但它不起作用:(。抛出以下错误:
ORA-00900:sentencia SQL no valida ORA-06512:en línea 12
当像这样修改“x”变量时:
x := 'BEGIN DESCRIBE '||item.OBJECT_NAME||'; END;';
我收到以下错误:
错误在线路 1:ORA-06550:线路 1,列 16:PLS-00103: 在预期以下情况之一时遇到符号“BVGKFDCS”: := 。 ( @ % ; 符号 ":=" 被替换为 "BVGKFDCS" 继续。 ORA-06512: 在线 12
其中“BVGKFDCS”是我的架构中的一个包的名称。
提前致谢。
P.D.我想得到类似的东西(但对于每个包裹):
DESCRIBE BVGKFDCS;
PROCEDURE P_GETPROFESSORS
Nombre de Argumento Tipo E/S ¿Por Defecto?
------------------------------ ----------------------- ------ --------
P_CAMP_IN VARCHAR2 IN
P_COLL_IN VARCHAR2 IN
P_DEPT_IN VARCHAR2 IN
P_TERM_IN VARCHAR2 IN
PROCEDURE P_GETTERMSBYPROF
Nombre de Argumento Tipo E/S ¿Por Defecto?
------------------------------ ----------------------- ------ --------
NAME_ARRAY TABLE OF VARCHAR2(32000) IN
VALUE_ARRAY TABLE OF VARCHAR2(32000) IN
PROCEDURE P_INIT
Nombre de Argumento Tipo E/S ¿Por Defecto?
------------------------------ ----------------------- ------ --------
PIDM VARCHAR2 IN
PROCEDURE P_OBTENER_VALOR
Nombre de Argumento Tipo E/S ¿Por Defecto?
------------------------------ ----------------------- ------ --------
请注意,此输出不同于:
select * from user_source
【问题讨论】:
Query to search all packages for table and/or column 的可能重复项 嗨,感谢重播。不,这不是重复的,因为 DESCRIBE 子句描述了此类包中所有过程的参数。DESCRIBE
或 DESC
不是子句。这是一个 SQL*Plus 命令。
谢谢,现在我知道了:)。
在此回答***.com/a/45515580/1859096
【参考方案1】:
看看USER_PROCEDURES
。我怀疑这是 DESCRIBE 在包、过程或函数上使用它时查询的内容。
编辑:对不起,还合并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
【讨论】:
感谢您的回答。我只是看了一下ALL_PROCEDURES,但它没有描述输入/输出参数及其类型。 抱歉 - 在 *_ARGUMENTS 视图中添加了信息 非常感谢,你真是个天才!【参考方案2】:您需要使用 User_Source、DBA_SOURCE 或 All_Source。所有代码都存储在那里。
select text
from user_source
where name = 'procedure_name'
order by line;
对象类型:FUNCTION、JAVA SOURCE、PACKAGE、PACKAGE BODY、PROCEDURE、TRIGGER、TYPE、TYPE BODY
【讨论】:
您好,感谢您的回答。我没有任何过程名称,我只有包名称。 @akolmogorov 然后把你的包名放在那里。我想,我清楚地发布了可以这样查询什么类型的对象 是的,你是对的。您清楚地发布了可能需要哪种类型的对象,并指出哪些表可以帮助解决此问题。不幸的是,您建议的表格都不适合我。这是@Dave Acosta 建议对我有用的组合。非常感谢您的耐心和努力。来自墨西哥的问候。【参考方案3】:describe
在execute immediate
中不起作用,因为它是 SQL*Plus 命令,而不是 SQL 或 PL/SQL 命令的一部分。它由客户端而不是服务器解释。
根据@T.S. 的建议,获取任何数据库对象(包括包和包主体)源的最佳方法是DBA_SOURCE
或USER_SOURCE
。
数据库中的每种对象都有数据字典视图。当尝试为其他对象类型获取类似类型的数据时,您应该参考dictionary
视图,它有助于对数据字典进行编目。例如,user_source
的 dictionary
条目是:
TABLE_NAME | COMMENTS
------------+------------------------------------------------
USER_SOURCE | Source of stored objects accessible to the user
过程名称是包规范的一部分。使用包名和 type='package'
查询 all_source
将返回规范,包括所有公共过程及其参数。
【讨论】:
非常感谢您的回答。由于您在上面解释的原因,我只是意识到这对你有用吗?
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>
【讨论】:
非常感谢您的回答。在这种情况下,SCOTT 适用于我的 Oracle 用户,对吗?如果是这种情况,那对我不起作用:(但感谢您的帮助。它向我抛出了错误:'no se ha encontrado el objeto "BVGKFDCS" del tipo PACKAGE en el esquema "SATURN"'。在哪里BVGKFDCS 是包,SATURN 是我的 ORACLE 用户。 不确定为什么它不适合你。我添加了 example 他们希望它能够工作的方式see this --- 可能是用户尝试查询文本有正确的访问权限吗?以上是关于如何在不使用 DESCRIBE 子句的情况下描述 ORACLE 包?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在不使用联合子句的情况下使用 rownum 显示给定表的第一行和最后一行
如何仅使用在不使用动态SQL的情况下检查的复选框,将WHERE子句设置为在多个位列上进行过滤?