2015-05-06 123 views
3

我一直在研究如何在不使用'DESCRIBE table/view'的情况下描述TABLES和VIEWS。条款。我发现,它可以使用类似解决:如何在不使用DESCRIBE子句的情况下描述ORACLE包?

SELECT column_name, data_type, data_length, data_precision, data_scale, nullable 
FROM all_tab_columns 
WHERE table_name = 'TABLE' 

这是一种计算机语言如PHP完全可编程的,但我没有发现“描述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”是我的模式的一个包的名称。

在此先感谢。

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 
+1

的可能重复[查询搜索所有包表和/或列(http://stackoverflow.com/questions/ 4852993/query-to-search-all-packages-for-table-and-or-column) –

+1

嗨,感谢您的重播。不,这不是重复的,因为DESCRIBE子句描述了这个包中所有过程的参数。 – akolmogorov

+1

'DESCRIBE'或'DESC'不是一个子句。这是一个SQL * Plus命令。 –

回答

4

看看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 
+0

感谢您的回答。我只是看看ALL_PROCEDURES,但它没有描述输入/ o输出参数及其类型。 – akolmogorov

+0

对不起 - 关于* _ ARGUMENTS视图的附加信息 –

+0

非常感谢您,您是一位天才! – akolmogorov

2

您需要使用USER_SOURCE,DBA_SOURCE或ALL_SOURCE。所有代码都存储在那里。

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

对象的类型:功能,JAVA源,PACKAGEPACKAGE BODY,过程,触发器,类型,类型主体

+0

嗨,谢谢你的回答。我没有任何程序名称,只是包名。 – akolmogorov

+1

@akolmogorov然后把你的包名称在那里。我认为,我明确地发布了哪种类型的对象可以用这种方式查询 –

+0

是的,你是对的。您明确发布了可以要求的对象类型,并指出哪些表可以为此解决方案提供帮助。不幸的是,你所建议的表格都不适合我。这是@Dave Acosta建议为我工作的组合。非常感谢您的耐心和努力。来自墨西哥的问候。 – akolmogorov

-1

这是否对你的工作?

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> 
+0

非常感谢您的回答。在这种情况下,SCOTT适合我的Oracle用户,对吧?如果是这样的话,那对我来说不起作用:(但是谢谢你的帮助,它给我带来了一个错误:'没有太阳能电池'BVGKFDCS'DELTOTE PACKAGE en el esquema“SATURN”'。 – akolmogorov

+0

不知道为什么它不适合你..我添加了**示例**他们的方式,我们期望它的工作[看到这个](https://asktom.oracle .com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID:30802454515375)---可能是用户试图查询文本是否有正确的访问权限? –

0

describe因为它是一个SQL * Plus命令,而不是无论是SQL或PL/SQL命令的一部分内不execute immediate工作。它由客户端而不是服务器来解释。

可以为任何数据库对象(包括包和包体)的来源,最好的办法是DBA_SOURCEUSER_SOURCE,通过@TS的建议。

有数据在各种对象的字典视图数据库。尝试为其他对象类型获取类似的数据类型时,应引用dictionary视图,该视图有助于编目数据字典。作为一个例子,所述dictionary条目user_source是:

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

程序名称是包说明书的一部分。使用包名查询all_sourcetype='package'将返回规范,包括所有公共过程及其参数。

+0

非常感谢您的支持我刚刚意识到不会与一起工作,这是因为您在那里解释的原因。问题是我没有过程名称,事实上,这正是我想要的(加上数据类型输入并输出这样的过程) – akolmogorov

相关问题