代码之家  ›  专栏  ›  技术社区  ›  Reindeer

Oracle数据泵元数据过滤器

  •  0
  • Reindeer  · 技术社区  · 2 年前

    在Oracle中,我想使用dbms_datapump导出表。我有一个表,其中包含要导出其子集的表名列表,其中grp=“batch1”。我想循环遍历这些表名中的每一个,并将表名传递给metadata_filter。然而,它不起作用。我特别想在一个循环中做到这一点。

    以下是代码的一些摘录:

    CURSOR lib_cur IS
         SELECT table_name
                       FROM my_table_list
                       WHERE grp = 'batch1';
    

    稍后在代码中:

    for x in lib_cur
        LOOP
    
         table_nm := x.table_name;
    
        dbms_datapump.metadata_filter          
        (handle      => my_job_handle,      
         name        => 'NAME_EXPR', 
         value       => 'IN (''' || table_nm || ''')' ,
         object_type => null); 
    

    有人知道为什么不将table_nm的当前值传递给dbms_datapump.metadata_filter的值参数吗?如果我硬编码其中一个我想要的实际表名,例如“表1”,它可以正常工作。

    我知道我的循环将正确的表名输入到table_nm变量中,因为我已经将它们输出到dbms_output,并且可以看到循环的每次迭代都会产生不同的表名。

    所以,有什么想法为什么这个名字没有在我的循环中传递吗?我不知道是语法不正确,还是不可能这样做?问题是,我确信我不久前就用过了!

    1 回复  |  直到 2 年前
        1
  •  1
  •   Paul W    2 年前

    每次循环中都要更换过滤器。您希望一次提供整个列表。尝试使用 LISTAGG 要将一个分隔的表列表组装成一个可以传递给筛选器的标量变量,请执行以下操作:

    SELECT 'IN ('''||LISTAGG(table_name,''',''') WITHIN GROUP (ORDER BY 1)||''')'
      INTO var_table_list
      FROM my_table_list
     WHERE grp = 'batch1';
    
     dbms_datapump.metadata_filter          
        (handle      => my_job_handle,      
         name        => 'NAME_EXPR', 
         value       => var_table_list,
         object_type => null);