0

我的情况很奇怪,我不知道如何处理它。设想:

在变量v_tables_param中,我有以下字符串(我要导出的表的名称)'IN(''REPORT_PERIOD'',''OBJECT_AVAILABILITY'')'

当我尝试指定导出表所需的以下元数据过滤器时:

DBMS_DATAPUMP.METADATA_FILTER(handle => n_h1, name =>'NAME_EXPR',value =>v_tables_param);

我得到一个ORA-39001: invalid argument value

但是,如果我将 的确切值编码v_tables_param到元数据过滤器中,它就像一个魅力:

DBMS_DATAPUMP.METADATA_FILTER(handle => n_h1, name =>'NAME_EXPR',value =>'IN(''REPORT_PERIOD'',''OBJECT_AVAILABILITY'')');

知道这里发生了什么吗?

当硬编码字符串与具有相同值的变量不同时,oracle 中是否存在一些奇怪的情况?

编辑:我添加了计算值的函数v_tables_param

FUNCTION SPLIT_TABLES(
    v_tables_list   VARCHAR2  --this is a string that looks like "table1,table2,table3"
) RETURN VARCHAR2 
IS
    n_idx               PLS_INTEGER;
    n_i                 PLS_INTEGER := 0;
    v_tables            VARCHAR2(2000) := v_tables_list;
    v_filter_value      VARCHAR(2000);
    v_current_table     VARCHAR2(200);
BEGIN

  v_filter_value := '''IN(';

  LOOP
    n_idx := instr(v_tables,',');
    IF n_idx > 0 THEN
      v_current_table := (substr(v_tables,1,n_idx-1));
      v_filter_value := v_filter_value || '''''' || v_current_table || ''''',';
      v_tables := substr(v_tables,n_idx+1);
      n_i := n_i + 1;
    ELSE
      v_current_table := v_tables;
      v_filter_value := v_filter_value || '''''' || v_current_table || ''''')''';
      EXIT;
    END IF;
  END LOOP;

  RETURN v_filter_value;

END SPLIT_TABLES;
4

2 回答 2

1

实际上还有更多参数metadata_filter文档错误的好例子):

SQL> desc dbms_datapump.metadata_filter
Parameter   Type     Mode Default? 
----------- -------- ---- -------- 
HANDLE      NUMBER   IN            
NAME        VARCHAR2 IN            
VALUE       VARCHAR2 IN            
OBJECT_PATH VARCHAR2 IN   Y        
OBJECT_TYPE VARCHAR2 IN   Y        
HANDLE      NUMBER   IN            
NAME        VARCHAR2 IN            
VALUE       CLOB     IN            
OBJECT_PATH VARCHAR2 IN   Y        
OBJECT_TYPE VARCHAR2 IN   Y      

...而且我相信您必须限定要过滤的对象类型:

object_type => 'TABLE'

提供函数源后更新:

从过滤器值的每一侧删除两个撇号。

只有编译器需要双撇号。filter 参数的值必须包含单个撇号,但您的函数会成对创建它们。

于 2013-06-14T15:32:53.740 回答
-2

你的变量应该只包含单引号

变量 = 'IN('REPORT_PERIOD','OBJECT_AVAILABILITY')'

然后,请尝试,它有效

于 2017-02-01T13:19:48.053 回答