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

发布于 2024-12-02 15:13:48 字数 202 浏览 2 评论 0原文

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

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

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

I have several external tables used to read file data into the DB each one for a particular file specification.

For files of a single format a table is reused by pointing it at a new default directory and new file name. This is working fine except I now need to dynamically change the BADFILE, LOGFILE and DISCARDFILE parameters whilst keeping the rest of the access parameters unchanged.

Is there a direct way to do this without having to respecify all the other access parameters (column transformations filed delimiters etc.) as well?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

咋地 2024-12-09 15:13:48

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

对于任何将来发现这个问题的人来说,我最终通过以下方法解决了这个问题:

选择外部表并在其访问参数上使用 REGEXP_REPLACE 来替换访问参数 BLOB 中与 BADFILE、LOGFILE 和DISCARDFILE 及其关联值与我提供的新值。

  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(并完全测试输出)意味着该过程不会太痛苦或太慢。

Unfortunately changing just the BADFILE, LOGFILE and DISCARDFILE parameters couldn't be achieved without having to respecify the other access parameters too.

For what it's worth and for anyone who finds this question in the future i eventually worked around the problem with the following:

Select the external table and use REGEXP_REPLACE on its access parameters to replace the parts of the access parameter BLOB that matched BADFILE, LOGFILE and DISCARDFILE and their associated values with the new values that I supplied.

  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);

I then used dynamic SQL to alter the external table and supplied the new access parameters.

  -- 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)
     || ')'
  );

It's not ideal and I did end up having to respecify ALL the access parameters but using the REGEX (and fully testing the output) meant the process wasn't too painful or slow.

属性 2024-12-09 15:13:48

从 Oracle 12cR2 开始,您可以 覆盖查询中外部表的参数

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

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

  • 默认目录

  • 地点

  • 访问参数

  • 拒绝限制

您可以在单个查询中修改多个子句。绑定变量
可以为 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
                 )
              );

Starting from Oracle 12cR2 you could override parameters for external tables in query.

The EXTERNAL MODIFY clause of a SELECT statement modifies external table parameters.

You can override the following clauses for an external table in an
EXTERNAL MODIFY clause:

  • DEFAULT DIRECTORY

  • LOCATION

  • ACCESS PARAMETERS

  • REJECT LIMIT

You can modify more than one clause in a single query. A bind variable
can be specified for LOCATION and REJECT LIMIT, but not for DEFAULT
DIRECTORY or ACCESS PARAMETERS.

For example:

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
                 )
              );
陌路终见情 2024-12-09 15:13:48

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

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 ) 
  );

You can change the ACCESS PARAMETERS clause leaving the rest unchanged.
see here http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/tables013.htm#i1007591
Note that as far as I know, If you want to change only the BADFILE, you still have to repeat all things in the ACCESS PARAMETERS.
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 ) 
  );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文