2012-10-08 3 views
0

ID를 기반으로 삽입하기 전에 기존 데이터를 삭제하고 싶습니다. 따라서 들어오는 파일에 ID가 있으면 기존 ID를 삭제 한 다음 데이터를 입력해야합니다. 이런 식으로 뭔가 :삽입하기 전에 기존 데이터를 삭제하십시오.

데이터베이스 테이블 전 :

-------------------------------- 
| ID | DATA     | 
-------------------------------- 
| 1 | This is data for ID 1 | 
| 2 | This is data for ID 2 | 
| 3 | This is data for ID 3 | 
-------------------------------- 

파일 수신 :

----------------------------------------- 
| ID | DATA       | 
----------------------------------------- 
| 1 | This is new data for ID 1  | 
| 2 | This is new data for ID 2  | 
| 4 | This is new data for ID 4  | 
| 1 | This is also new data for ID 1 | 
----------------------------------------- 

데이터베이스 테이블 AFTER :

----------------------------------------- 
| ID | DATA       | 
----------------------------------------- 
| 1 | This is new data for ID 1  | 
| 2 | This is new data for ID 2  | 
| 4 | This is new data for ID 4  | 
| 1 | This is also new data for ID 1 | 
| 3 | This is data for ID 3   | 
----------------------------------------- 

이 내 절차입니다.

CREATE OR REPLACE PROCEDURE absence_records_in AS 
    l_v_file  UTL_FILE.file_type; 
    l_filename VARCHAR2(128); 
    l_buffer  VARCHAR2(4096); 
    l_start  BINARY_INTEGER := 1; 
    l_pos   BINARY_INTEGER; 
    TYPE typ_cols IS TABLE OF VARCHAR2(4096) INDEX BY BINARY_INTEGER; 
    tbl_cols  typ_cols; 
    l_col_no  BINARY_INTEGER; 
    l_count  BINARY_INTEGER := 0; 
BEGIN 
    l_filename := 'records.csv'; 
    l_v_file := UTL_FILE.fopen('DIR_FENIX_IN', l_filename, 'R'); 
    UTL_FILE.get_line(l_v_file, l_buffer); 
    LOOP 
     BEGIN 
      UTL_FILE.get_line(l_v_file, l_buffer); 
      IF l_buffer IS NULL THEN 
       EXIT; 
      END IF; 
      l_col_no := 1; 
      l_start := 1; 
      WHILE INSTR(l_buffer, ';', 1, l_col_no) !=0 
      LOOP 
       l_pos := INSTR(l_buffer, ';', 1, l_col_no); 
       tbl_cols(l_col_no) := SUBSTR(l_buffer, l_start, l_pos - l_start); 
       l_start := l_pos + 1; 
       l_col_no := l_col_no + 1; 
      END LOOP; 
      l_start := l_pos + 1; 
      tbl_cols(l_col_no) := SUBSTR(l_buffer, l_start); 

      DELETE FROM absence_records WHERE id = tbl_cols(1) 
      LOG ERRORS INTO in_errors('File: '||l_filename||' => delete operation') REJECT LIMIT UNLIMITED; 

      l_count := l_count + 1; 
       EXCEPTION WHEN NO_DATA_FOUND THEN 
      EXIT; 
     END; 
     BEGIN 
      UTL_FILE.get_line(l_v_file, l_buffer); 
      IF l_buffer IS NULL THEN 
       EXIT; 
      END IF; 
      l_col_no := 1; 
      l_start := 1; 
      WHILE INSTR(l_buffer, ';', 1, l_col_no) !=0 
      LOOP 
       l_pos := INSTR(l_buffer, ';', 1, l_col_no); 
       tbl_cols(l_col_no) := SUBSTR(l_buffer, l_start, l_pos - l_start); 
       l_start := l_pos + 1; 
       l_col_no := l_col_no + 1; 
      END LOOP; 
      l_start := l_pos + 1; 
      tbl_cols(l_col_no) := SUBSTR(l_buffer, l_start); 

      INSERT INTO absence_records (id, data) 
      VALUES (tbl_cols(1), tbl_cols(2)) 
      LOG ERRORS INTO in_errors('File: '||l_filename|| ' => insert operation') REJECT LIMIT UNLIMITED; 

      l_count := l_count + 1; 
       EXCEPTION WHEN NO_DATA_FOUND THEN 
      EXIT; 
     END; 
    END LOOP; 
    UTL_FILE.fclose(l_v_file);   
END absence_records_in; 

그래서 짧은에, 나는 데이터를 삽입에만 비교에 데이터를 다음 다른 루프를 삭제 한 루프를 시작해야합니다. 아이디어가 있으십니까? 미리 감사드립니다 :-)

답변

0

:

  1. 모든 기록을 삭제하려면 새 테이블 TEMP로 파일에서 데이터를 읽고 TEMP에있는 ID, TABLE.ID IN이
+0

저장 프로시 저는 주로 CSV 파일을 구문 분석하는 것과 관련이 있습니다. csv 파일을 테이블로 읽는 데 다른 방법을 사용할 수 없습니까? 예 : 여기 http://stackoverflow.com/questions/6198863/oracle-import-csv-file-using-sqlplus – Zane

0

일을 시도

  • 이 표에 TEMP에서 모든 레코드를 추가 (TEMP FROM ID를 선택) WHERE 테이블에서 DELETE와 같은 뭔가 e 다음 :

    1. 예외 처리기가있는 첫 번째 BEGIN의 END 바로 다음에 첫 번째 루프를 닫습니다.
    2. 파일을 닫습니다.
    3. 파일을 다시 엽니 다.
    4. 예외 처리기가있는 두 번째 BEGIN 바로 전에 다른 루프를 시작하십시오.

    (2) 및 (3) 대신 UTL_FILE.fseek (file, 0)을 사용할 수 있습니다.

    공유하고 즐기십시오.

  • 관련 문제