在oracle元数据过滤器中选择表

时间:2015-07-20 07:32:30

标签: oracle datapump

我使用oracle DATA PUMP API使用命令

导出一些数据库表
DBMS_DATAPUMP.METADATA_FILTER (handle,'NAME_EXPR','IN ('''||Table_name||''')','TABLE')

由于上面的代码将导出table_name中提供的表名。但我会在另一个表B中列出表名。有没有办法可以在元数据过滤器中提供选择查询,以便导出表B中的所有表名?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

但是你可以使用没有LISTAGG的select语句,因为METADATA_FILTER可以在SQL中使用NAME_EXPR进行评估。

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

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

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

您可以在运行时使用plain sql:

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

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

  

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

相关问题