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;
그래서 짧은에, 나는 데이터를 삽입에만 비교에 데이터를 다음 다른 루프를 삭제 한 루프를 시작해야합니다. 아이디어가 있으십니까? 미리 감사드립니다 :-)
저장 프로시 저는 주로 CSV 파일을 구문 분석하는 것과 관련이 있습니다. csv 파일을 테이블로 읽는 데 다른 방법을 사용할 수 없습니까? 예 : 여기 http://stackoverflow.com/questions/6198863/oracle-import-csv-file-using-sqlplus – Zane