2013-08-07 2 views
0

그래서이 parse_file 'clean_files_up procedure'절차를 변경하려고합니다. 나는 변경 사항을 코딩했지만 테스트 한 후에는 실현했습니다. 실제로 무슨 일이 일어나고 있는지 이해하는 데 어려움을 겪고 있습니다. 필자는 결코 파일 또는 utl_file을 구문 분석하는 작업을 한 적이 없어서 완전히 개념을 undrestand 하지 않습니다. Utl_file 이해하기

그래서 요약하면, 우리는 NEWFILE_DIRECTORY라는 디렉토리에서 현재 SYSDATE로 Files20130807.xxx라는 파일을 찾을 필요가있다. 그것은 다른 디렉토리라고 ORIGINALFILE_DIRECTORY에 을있는 기존 이메일 파일을 실행 한 다음 절차의 끝을 갈 필요 현재 SYSDATE 일치하는 파일을 찾을 수 있다는 것을 의미없는 파일이없는 경우. 현재 sysdate와 일치하는 파일이 있으면 절차를 계속 진행해야합니다. 이지면에 실제로 NEWFILE_DIRECTORY 에서 현재 파일이 다음 열려있는 경우 그렇지 않은 경우에있는 원본 파일을 열어야합니다, 그것은 파일을 구문 분석 한 후 NEWFILE_DIRECTORY에서 현재 SYSDATE과 일치하는 파일을 열 것이다 파일을 열어 ORIGNIALFILE_DIRECTORY를 입력하고 대신 해당 파일을 구문 분석합니다.

PROCEDURE clean_files_up IS 
v_fileName VARCHAR2(20) := Files || to_char(sysdate, 'YYYYMMDD') || '.xxx'; 
v_inFile utl_file.file_type; 
v_outFile utl_file.file_type; 
v_line  VARCHAR2(2000); 
v_newLine VARCHAR2(2000); 
v_count  NUMBER := 1; 

BEGIN 

--No Files found for current date 
    IF (substr(v_fileName, 6, 8)) <> to_char(sysdate, 'YYYYMMDD') THEN 
    v_inFile := utl_file.fopen('ORIGINALFILE_DIRECTORY', 'OriginalFile.xxx', 'r'); 

    RETURN; --go to end of procedure 
    END IF; 

    v_inFile := utl_file.fopen ('NEWFILE_DIRECTORY', 'v_fileName', 'r'); 
    IF utl_file.is_open(v_inFile) THEN 
     v_outFile := utl_file.fopen('ORIGINALFILE_DIRECTORY',      
           'OriginalFile.xxx', 
           'W'); 

LOOP 
    BEGIN 
     utl_file.get_line(v_inFile, v_line); 
     IF v_line IS NULL THEN 
     EXIT; 
     END IF; 
     IF v_count > 1 THEN 
     get_new_csv_line(v_line, v_newLine); 
     utl_file.put_line(v_outFile, v_newLine); 
     utl_file.fflush(v_outFile); 
     END IF; 
     v_count := v_count + 1; 
    EXCEPTION 
     WHEN no_data_found THEN 
     EXIT; 
    END; 
    END LOOP; 
    utl_file.fclose(v_outFile); 
END IF; 

EXCEPTION 
    WHEN OTHERS THEN 
    Condition; 

END clean_files_up; 

질문 :

  1. 그래서 내가 좋아하는 파일 의 목록이/XXX/XXX/XXX 일부 파일 경로에 위치 NEWFILE_DIRECTORY라는 새로운 디렉토리를 작성해야합니다; Files20130804.xxx, Files20130805.xxx, Files20130806.xxx, Files20130807 locted. 이 절차의 내부 내가 새 디렉토리를 작성하거나 심지어 내가 절차

내에서 그것을 만들 수 있으면되는 것이다 어디 를 모르는 CREATE OR로 DIRECTORY의 newfile_directory 교체 '/ XXX/XXX/XXX'

2 .. sysdate와 일치하는지 확인하려면이 파일을 읽어야합니다. 그렇지 않으면 원래 파일을 실행해야하고 다음 proceudre 끝으로 이동하십시오. 이 부분은 BEGIN 바로 뒤에있는 IF 문입니다. 나는 이 NEWFILE_DIRECTORY에서 일치하는 파일 이름 Files20130807.xxx를 찾아서 일치하는지 아닌지를 아는 방법에 대해서 혼란스러워합니다.

3 ..이 # 2에 비슷한 질문은하지만 어떻게 (IF 첫 번째 종료 후) 수행 NEWFILE_DIRECOTRY 및 ORIGINALFILE_DIRECTORY에 대한 파일 경로가 제공 또는 경로를 정의하지 않고있는 위치는 알아?

4 마지막으로 코드를 테스트 할 때 v_inFile : = utl_file.fopen ('NEWFILE_DIRECTORY', 'v_fileName', 'r'); (첫 번째 End IF; 바로 다음), if 및 loop를 계속하지 않고 예외로갑니다.

나는 누군가가 질문에 무슨 일이 일어나고 있는지 이해하기 위해 적어도 도움이됩니다 논문 대답 할 수 그것을 정말 감사하겠습니다. 또한 내가 clearfiy 및 질문 (1-4)해야 할 경우 나는 그것을 할 수 있습니다. 귀하의 질문에

답변

1

답변 :

1) 코드 다음은 시스템 디렉토리를 파일로) DBA_DIRECTORIES에서 데이터를 선택하여 볼 수 있습니다 (오라클 내부적으로 정의 된 디렉토리에서 링크를 만듭니다.

CREATE OR REPLACE DIRECTORY NEWFILE_DIRECTORY AS '/xxx/xxx/xxx' 

만약 경로 '/ XXX/XXX/XXX'이미 파일 시스템에, 다음이 올바른 방법이 될 것입니다 존재한다.

2) 올바르게 이해하면 NEWFILE_DIRECTORY 파일에 현재 날짜가있는 파일이 있는지 확인해야합니다. 될 경우

FUNCTION check_if_file_exists 
    (p_file_name IN VARCHAR2 
    ,p_file_dir IN VARCHAR2) 
RETURN BOOLEAN 
IS 
    v_file utl_file.file_type; 
BEGIN 
    v_file := utl_file.fopen(p_file_dir, p_file_name, 'R'); 

    IF utl_file.is_open(v_file) THEN 
    RETURN TRUE; 
    ELSE 
    RETURN FALSE; 
    END IF; 
EXCEPTION 
    WHEN UTL_FILE.invalid_path THEN 
    RETURN FALSE; 
    WHEN utl_file.invalid_operation THEN 
    RETURN FALSE; 
END check_if_file_exists; 

그리고 첫 번째 : 그것은 다음과 같은 기능을 수행 할 수 있습니다 당신은 DB 파일 시스템 경로를 찾기위한 "에 의해) (매핑 DB 디렉토리를 만듭니다 수

IF check_if_file_exists(v_fileName, 'NEWFILE_DIRECTORY') THEN 

3) REPLACE DIRECTORY "(# 1 참조)

4) 매개 변수를 변수 v_fileName이 아닌 문자열 값 'v_fileName'으로 전달합니다. 올바른 코드는 다음과 같습니다

v_inFile := utl_file.fopen ('NEWFILE_DIRECTORY', v_fileName, 'r'); 
0

제니스 Baiza 그것이 정말 나에게 무슨 일이 있었는지 이해하는 데 도움이 대답 주셔서 감사합니다.

실제로 파일이 현재 디렉토리에도 존재하는지 확인하고 존재하는 파일을 출력하고 존재하지 않는다면 파일이 존재하지 않으며 원본 파일을 실행한다는 사실을 발견했습니다. 파일을 선택하고 프로 시저의 끝으로 돌아갑니다.

utl_file.fgetattr ('NEWFILE_DIRECTORY', v_fileName, v_check_fileEX, v_fLength, v_Bsize); 
IF v_check_fileEX THEN 
dbms_output.put_line('file exists'); 
END IF; 
IF NOT v_check_fileEX THEN 
dbms_output.put_line('file does not exist'); 

v_inFile := utl_file.fopen('ORIGINALFILE_DIRECTORY', 'OriginalFile.xxx', 'r'); 

RETURN; 
END IF;