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

ako*_*rov 3 oracle sqlplus describe oracle11g

我一直在研究如何在不使用“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'
Run Code Online (Sandbox Code Playgroud)

这在像 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;
Run Code Online (Sandbox Code Playgroud)

但它没有用:(。抛出以下错误:

ORA-00900:sentencia SQL 无效 ORA-06512:en línea 12

当像这样修改“x”变量时:

x := 'BEGIN DESCRIBE '||item.OBJECT_NAME||'; END;';
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ERROR en línea 1: ORA-06550: línea 1, columna 16: PLS-00103: 遇到以下符号“BVGKFDCS”: := 。( @ % ; 符号 ":=" 被替换为 "BVGKFDCS" 以继续。ORA-06512: en línea 12

其中“BVGKFDCS”是我的架构包之一的名称。

提前致谢。

PD 我想得到类似的东西(但对于每个包):

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?
 ------------------------------ ----------------------- ------ --------
Run Code Online (Sandbox Code Playgroud)

请注意,此输出不同于:

select * from user_source
Run Code Online (Sandbox Code Playgroud)

Dav*_*sta 5

看看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
Run Code Online (Sandbox Code Playgroud)