我有几个外部表用于将文件数据读入数据库,每个表用于特定的文件规范。
对于单一格式的文件,通过将表指向新的默认目录和新文件名来重用表。这工作正常,但我现在需要动态更改BADFILE,LOGFILE和DISCARDFILE参数,同时保持其余的访问参数不变。
有没有直接的方法来做到这一点,而不必重新指定所有其他访问参数(列转换提交分隔符等)?
答案 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
)
);