【问题标题】:Selecting Tables in oracle metadata filter在 oracle 元数据过滤器中选择表
【发布时间】:2017-08-28 23:35:10
【问题描述】:

我正在使用 oracle DATA PUMP API 使用命令导出一些数据库表

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

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

【问题讨论】:

    标签: oracle datapump


    【解决方案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 将表中的数据作为列表。

    【讨论】:

      【解决方案2】:

      正如 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 来支持使用通配符)。

      【讨论】:

        猜你喜欢
        • 2016-10-10
        • 2023-04-09
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多