2011-08-30 2 views
0

특정 파일 사양에 대해 파일 데이터를 DB에 각각 읽는 데 사용되는 여러 외부 테이블이 있습니다.외부 테이블 BADFILE, LOGFILE 및 DISCARDFILE 매개 변수 만 변경

단일 형식의 파일의 경우 테이블을 새 기본 디렉터리와 새 파일 이름으로 가리켜 재사용합니다. BADFILE, LOGFILE 및 DISCARDFILE 매개 변수를 동적으로 변경해야하며 나머지 액세스 매개 변수는 변경하지 않아도된다는 점을 제외하고는 정상적으로 작동합니다.

다른 모든 액세스 매개 변수 (구분 기호 등을 적용한 열 변환)도 다시 지정하지 않고도이를 수행 할 수있는 직접적인 방법이 있습니까?

답변

2

불행하게도 바로 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) 
    || ')' 
); 

그것은 이상적인 아니에요 나는 모든 액세스 매개 변수를 서술하여야 할 필요가 있지만 정규식을 사용하여 (완전히 출력을 테스트)를 종료하는 과정이 너무 고통스럽고 느린하지 의미했다 않았다.

0

나머지는 변경하지 않고 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) 
); 
+0

동적으로 액세스 매개 변수를 변경할 수 있지만 내 질문에 묻는 것처럼 다른 매개 변수를 다시 구체화 할 필요없이 BADFILE, LOGFILE 등 변경할 메서드가 필요합니다. 나는 이것이 할 수 없다고 생각하고있다. – Ollie

+0

나는 본다. 잘 수행 할 수 있지만 메타 데이터 (http://en.wikipedia.org/wiki/Oracle_metadata)에서 원래의 ACCESS PARAMETERS 절을 동적으로 다시 만들어야합니다. 어려운 일인 것처럼 보입니다. 어떻게해야하는지에 대한 새로운 글을 개설 할 것을 제안합니다. ACCESS PARAMETERS 절을 재 작성한 후에는 BADFILE 및 LOGFILE을 바꾼 다음 ALTER TABLE을 실행하십시오. – bpgergo

+0

액세스 매개 변수에 대한 메타 데이터를 얻는 것이 어렵다는 것은 아닙니다. 특히 액세스 매개 변수를 모두 변경해야하는 경우 버그가 발생할 가능성이 높습니다. 특히 많은 수의 고정 너비 파일에 대한 액세스 매개 변수. 나는 다른 각도에서 그 문제에 접근해야한다고 생각합니다. – Ollie