选择表格我使用的是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来支持使用通配符)。