我有一個非常繁瑣的任務,就是從一個龐大的模式中查找幾個表,併爲這些表生成DDL。如何以編程方式從Oracle數據庫生成DDL?
說,我已經有了一個schemaA
有1000個表,我需要找到如果在這個schemaA
存在一個tableA
,如果這樣做,生成DDL,並將其保存到文件系統,如果不這樣做,打印它的名字了或將其寫入文件。有任何想法嗎?
我有一個非常繁瑣的任務,就是從一個龐大的模式中查找幾個表,併爲這些表生成DDL。如何以編程方式從Oracle數據庫生成DDL?
說,我已經有了一個schemaA
有1000個表,我需要找到如果在這個schemaA
存在一個tableA
,如果這樣做,生成DDL,並將其保存到文件系統,如果不這樣做,打印它的名字了或將其寫入文件。有任何想法嗎?
DBMS_METADATA包(假設您使用的是相當新的Oracle版本)將爲數據庫中的任何對象生成DDL。因此,
SELECT dbms_metadata.get_ddl('TABLE', 'TABLEA', 'SCHEMAA')
FROM dual;
將爲SchemaA.TableA返回帶DDL的CLOB。你可以趕上拋出的對象不存在異常,但我往往會建議你查詢數據字典(即DBA_OBJECTS),以驗證是否有一個名爲表A中SchemaA表,即
SELECT COUNT(*)
FROM dba_objects
WHERE owner = 'SCHEMAA'
AND object_name = 'TABLEA'
AND object_type = 'TABLE'
請注意,如果您無權訪問DBA_OBJECTS,則可以改爲使用ALL_OBJECTS。然而,那裏的擔心是SchemaA中可能有一個TableA沒有SELECT訪問權限。該表不會出現在ALL_OBJECTS(其中包含您有權訪問的所有對象),但會出現在DBA_OBJECTS(其中包含數據庫中的所有對象,無論您是否有權訪問它們)。
然後,您可以將DDL寫入文件,或者如果計數爲0,則表明該對象不存在。從存儲過程中,可以使用UTL_FILE包寫入數據庫服務器上的文件。如果您嘗試寫入客戶端文件系統上的文件,則需要使用可訪問客戶端操作系統資源的語言。一個小的C/Java/Perl /等程序應該能夠選擇一個CLOB並將該數據寫入客戶端操作系統上的一個文件。
偉大的,賈斯汀,我已經測試了你的sql工程的第一部分很棒,但是當我運行第二部分時,我得到了一個ORA-00942:表或視圖不存在。我怎樣才能使用sql編寫一個clob到文件? – Sawyer 2010-11-12 01:54:31
@ZZcat - 更新了我的回答 – 2010-11-12 02:08:53
Tiny省略 - 第一個示例SQL需要'TABLE'和'TABLEA'之間的逗號,否則失敗。 – 2012-11-14 11:37:22