불행하게도 바로 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)
|| ')'
);
그것은 이상적인 아니에요 나는 모든 액세스 매개 변수를 서술하여야 할 필요가 있지만 정규식을 사용하여 (완전히 출력을 테스트)를 종료하는 과정이 너무 고통스럽고 느린하지 의미했다 않았다.
동적으로 액세스 매개 변수를 변경할 수 있지만 내 질문에 묻는 것처럼 다른 매개 변수를 다시 구체화 할 필요없이 BADFILE, LOGFILE 등 변경할 메서드가 필요합니다. 나는 이것이 할 수 없다고 생각하고있다. – Ollie
나는 본다. 잘 수행 할 수 있지만 메타 데이터 (http://en.wikipedia.org/wiki/Oracle_metadata)에서 원래의 ACCESS PARAMETERS 절을 동적으로 다시 만들어야합니다. 어려운 일인 것처럼 보입니다. 어떻게해야하는지에 대한 새로운 글을 개설 할 것을 제안합니다. ACCESS PARAMETERS 절을 재 작성한 후에는 BADFILE 및 LOGFILE을 바꾼 다음 ALTER TABLE을 실행하십시오. – bpgergo
액세스 매개 변수에 대한 메타 데이터를 얻는 것이 어렵다는 것은 아닙니다. 특히 액세스 매개 변수를 모두 변경해야하는 경우 버그가 발생할 가능성이 높습니다. 특히 많은 수의 고정 너비 파일에 대한 액세스 매개 변수. 나는 다른 각도에서 그 문제에 접근해야한다고 생각합니다. – Ollie