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

zdz8207 阅读:15 2024-09-07 23:24:14 评论:0

我一直在研究如何在不使用“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 válida ORA-06512: en línea 12

当像这样修改 'x' 变量时:

x := 'BEGIN DESCRIBE '||item.OBJECT_NAME||'; END;'; 

我收到以下错误:

ERROR en línea 1: ORA-06550: línea 1, columna 16: PLS-00103: Encountered the symbol "BVGKFDCS" when expecting one of the following: := . ( @ % ; The symbol ":=" was substituted for "BVGKFDCS" to continue. 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? 
 ------------------------------ ----------------------- ------ -------- 

请注意,此输出不同于:

select * from user_source 

请您参考如下方法:

看看 USER_PROCEDURES。我怀疑这就是当您在包、过程或函数上使用 DESCRIBE 时查询的内容。

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

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 


标签:oracle
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号