1

I am using the oracle DATA PUMP API to export some database tables using the command

DBMS_DATAPUMP.METADATA_FILTER (handle,'NAME_EXPR','IN ('''||Table_name||''')','TABLE')

As the above code will export the table name provided in table_name. But i will have the table names listed in another table B. Is there a way that i can provide a select query in the Metadata Filter so that all the table name present in Table B will be exported?

4

2 回答 2

2

我自己想通了。需要用到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 将表中的数据作为列表。

于 2015-07-20T11:40:25.643 回答
0

正如 Saroj 在他的回答中所说,您可以使用 LISTAGG 来组合表名。

但是,您可以只使用不带 LISTAGG 的 select 语句,因为 METADATA_FILTER 可以在 SQL 中使用 NAME_EXPR 来进行评估。

大多数教程只是为此使用静态 IN 子句,如下所示:

DBMS_DATAPUMP.METADATA_FILTER (handle,'NAME_EXPR','IN (''DEPARTMENTS'')','TABLE')

使用双引号将导致常规引号和有效 sql。

您可以在运行时使用普通 sql 进行评估:

DBMS_DATAPUMP.METADATA_FILTER (handle,'NAME_EXPR','IN (SELECT NAME FROM DEPARTMENTS WHERE DEPARTMENT_ID > 2)','TABLE')

Oracle DBMS_DATAPUMP 文档说明以下内容来解释 sql 表达式的用法:

支持每个过滤器的两个版本:SQL 表达式和列表。过滤器的 SQL 表达式版本为识别对象提供了最大的灵活性(例如,使用 LIKE 来支持使用通配符)。

于 2017-08-28T15:35:10.103 回答