سؤال

My situation is quite strange, and i don't have any ideea on how to handle it. Scenario:

In variable v_tables_param I have the following string (the names of the tables that iwant to export) 'IN(''REPORT_PERIOD'',''OBJECT_AVAILABILITY'')'.

when i try to specify the following metadata filter that i need in order export the tables :

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

i get a ORA-39001: invalid argument value.

However, if i hrad code the exact value of v_tables_param into the metadata filter, it works like a charm :

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

Any idea what is happening here?

Are there some weird scenarios in oracle when a hard coded string is different from a variable that has the same value ?

EDIT: I added the function that computes the value of 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;
هل كانت مفيدة؟

المحلول

Ther're actually more parameters to metadata_filter (nice example of a doc bug):

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      

...and I believe you'll have to qualify the object type you're filtering for:

object_type => 'TABLE'

update after you provided the function source:

Remove two apostrophes from each side of the filter values.

Double apostrophes are required by the compiler only. The value of the filter parameter must contain single apostrophes, but your function creates them in pairs.

نصائح أخرى

your variable should contain only single quote

variable = 'IN('REPORT_PERIOD','OBJECT_AVAILABILITY')'

then, pls try , it works

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top