2015-05-06 27 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

相關問題