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 |
-----------------------------------------

後のデータベース テーブル:

-----------------------------------------
| 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;

つまり、比較対象のデータのみを削除するループを 1 つ開始してから、データを挿入する別のループを開始する必要があります。何か案は?前もって感謝します :-)

4

3 に答える 3

0

私はこれを次のように行います:

  1. ファイルから新しいテーブルTEMPにデータを読み込みます
  2. TEMPにあるIDを持つすべてのレコードを削除します。たとえば、DELETE FROM TABLE WHERE TABLE.ID IN(SELECT ID FROM TEMP)などです。
  3. TEMPからTABLEにすべてのレコードを追加します
于 2012-10-08T11:07:15.210 に答える
0

次のことを試してください。

  1. 例外ハンドラを持つ最初の BEGIN の END の直後に最初のループを閉じます。
  2. ファイルを閉じます。
  3. ファイルを再度開きます。
  4. 例外ハンドラを持つ 2 番目の BEGIN の直前に別のループを開始します。

(2) と (3) の代わりに、UTL_FILE.fseek(file, 0) を実行できることに注意してください。

共有してお楽しみください。

于 2012-10-08T11:15:48.897 に答える
0

上記のわずかに異なるひねりは、データをマージ/アップサートすることです。Oracle でデータをマージする方法については、こちらをご覧ください: Oracle: how to UPSERT (update or insert into a table?)

于 2012-10-08T10:59:24.050 に答える