選擇表格我使用的是Oracle數據泵API使用命令在Oracle元數據過濾
DBMS_DATAPUMP.METADATA_FILTER (handle,'NAME_EXPR','IN ('''||Table_name||''')','TABLE')
正如上面的代碼將出口table_name中提供的表名導出一些數據庫表。但是我將在另一個表B中列出表名。是否有一種方法可以在元數據過濾器中提供選擇查詢,以便將表B中存在的所有表名稱導出?
選擇表格我使用的是Oracle數據泵API使用命令在Oracle元數據過濾
DBMS_DATAPUMP.METADATA_FILTER (handle,'NAME_EXPR','IN ('''||Table_name||''')','TABLE')
正如上面的代碼將出口table_name中提供的表名導出一些數據庫表。但是我將在另一個表B中列出表名。是否有一種方法可以在元數據過濾器中提供選擇查詢,以便將表B中存在的所有表名稱導出?
我想出了自己。需要使用listagg函數。該功能只是將查詢結果組織爲列表。
Table_List VARCHAR2(2000);
SELECT listagg (''''||table_column||'''',',') WITHIN GROUP (ORDER BY table_column) INTO Table_List FROM
(SELECT * FROM Table_B)
DBMS_DATAPUMP.METADATA_FILTER (handle,'NAME_EXPR','IN ('||Table_List||')','TABLE')
Table_list將表中的數據作爲列表。
正如Saroj在他的回答中所述,您可以使用LISTAGG來合併表名稱。
但是,您可以只使用沒有LISTAGG的select語句,因爲METADATA_FILTER可以在SQL中接受一個NAME_EXPR,它將被評估。
大多數教程簡單地用一個靜中有此條款,如:
DBMS_DATAPUMP.METADATA_FILTER (handle,'NAME_EXPR','IN (''DEPARTMENTS'')','TABLE')
雙引號的使用會導致正規報價和有效的SQL。
您可以在運行時使用的評價與普通的SQL:每個過濾器的
兩個版本:下面的解釋SQL表達式的用法
DBMS_DATAPUMP.METADATA_FILTER (handle,'NAME_EXPR','IN (SELECT NAME FROM DEPARTMENTS WHERE DEPARTMENT_ID > 2)','TABLE')
甲骨文DBMS_DATAPUMP文檔聲明支持:SQL表達式和List。過濾器的SQL表達式版本爲識別對象提供了最大的靈活性(例如使用LIKE來支持使用通配符)。