仅更改外部表BADFILE,LOGFILE和DISCARDFILE参数

时间:2011-08-30 14:35:16

标签: oracle oracle10g external-tables

我有几个外部表用于将文件数据读入数据库,每个表用于特定的文件规范。

对于单一格式的文件,通过将表指向新的默认目录和新文件名来重用表。这工作正常,但我现在需要动态更改BADFILE,LOGFILE和DISCARDFILE参数,同时保持其余的访问参数不变。

有没有直接的方法来做到这一点,而不必重新指定所有其他访问参数(列转换提交分隔符等)?

3 个答案:

答案 0 :(得分:3)

不幸的是,如果不重新指定其他访问参数,就无法更改BADFILE,LOGFILE和DISCARDFILE参数。

对于它的价值,对于将来发现这个问题的任何人,我最终解决了以下问题:

选择外部表并在其访问参数上使用REGEXP_REPLACE,将匹配BADFILE,LOGFILE和DISCARDFILE的访问参数BLOB及其关联值替换为我提供的新值。

  CURSOR external_table_cur(
     cp_external_table IN VARCHAR2,
     cp_new_log_dir IN VARCHAR2,
     cp_log_file IN VARCHAR2
  )
  IS
     SELECT table_name,
            REGEXP_REPLACE(
               access_parameters,
               <REGEX PATTERN>,
               cp_new_log_dir||':'''||LOWER(cp_log_file),
               1,
               0,
               'i'
            ) AS new_access_params
       FROM all_external_tables
      WHERE table_name = UPPER(cp_external_table);

然后我使用动态SQL来改变外部表并提供了新的访问参数。

  -- Point external table to new file, directory and access params
  EXECUTE IMMEDIATE(
     'ALTER TABLE '
     || p_table_name
     || ' DEFAULT DIRECTORY '
     || p_directory
     || ' LOCATION ('''
     || p_filename
     || ''') '
     || ' ACCESS PARAMETERS ('
     || TO_CHAR(new_access_params)
     || ')'
  );

这不理想,我最终不得不重新指定所有访问参数,但使用REGEX(并完全测试输出)意味着该过程不是太痛苦或缓慢。

答案 1 :(得分:0)

您可以更改ACCESS PARAMETERS子句,其余部分保持不变。 见http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/tables013.htm#i1007591 请注意,据我所知,如果您只想更改BADFILE,您仍需要重复访问参数中的所有内容。
e.g:

ALTER TABLE ext_table
  ACCESS PARAMETERS
   (
     records delimited by newline 
     badfile admin_bad_dir:'empxt%a_%p.bad' 
     logfile admin_log_dir:'empxt%a_%p.log' 
     fields terminated by ',' 
     missing field values are null 
     ( field1, field2 ) 
  );

答案 2 :(得分:0)

从Oracle 12cR2开始,您可以override parameters for external tables in query

  

SELECT语句的EXTERNAL MODIFY子句修改外部表参数。

     

您可以覆盖以下外部表的子句   EXTERNAL MODIFY子句:

     
      
  • DEFAULT DIRECTORY

  •   
  • LOCATION

  •   
  • 访问参数

  •   
  • 拒绝限制

  •   
     

您可以在单个查询中修改多个子句。绑定变量   可以为LOCATION和REJECT LIMIT指定,但不能为DEFAULT指定   目录或访问参数。

例如:

SELECT *
FROM tab_ext EXTERNAL MODIFY (
                 ACCESS PARAMETERS (
                   BADFILE temp_dir_2:'some_tab_ext_%a_%p.bad'
                   LOGFILE temp_dir_2
                   DISCARDFILE temp_dir_2
                 )
              );