Oracle 在插入之前删除现有数据
我想在基于ID插入之前删除现有数据。所以,若传入文件中有ID,那个么应该删除现有ID,然后输入数据。大概是这样的: 之前的数据库表:Oracle 在插入之前删除现有数据,oracle,plsql,oracle11g,plsqldeveloper,Oracle,Plsql,Oracle11g,Plsqldeveloper,我想在基于ID插入之前删除现有数据。所以,若传入文件中有ID,那个么应该删除现有ID,然后输入数据。大概是这样的: 之前的数据库表: -------------------------------- | ID | DATA | -------------------------------- | 1 | This is data for ID 1 | | 2 | This is data for ID 2 | | 3 | This is d
--------------------------------
| 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;
简而言之,我需要启动一个循环,只删除比较中的数据,然后启动另一个循环,插入数据。
有什么想法吗?提前感谢:-上面稍微不同的一点是合并/上传数据。
请看一下如何在Oracle中合并数据:我将采用以下方法: 将文件中的数据读取到新的临时表中 删除所有ID在TEMP中的记录,类似于从表中删除,其中SELECT ID FROM TEMP中的TABLE.ID 将TEMP中的所有记录添加到表中 请尝试以下操作: 在具有异常处理程序的第一个BEGIN结束后立即关闭第一个循环。 关闭文件。 再次打开该文件。 在具有异常处理程序的第二个开始之前立即启动另一个循环。 请注意,您可以只执行UTL_FILE.fseekfile,0,而不是2和3
共享和享受。您的存储过程主要与解析CSV文件有关。您不能使用其他方法将csv文件读入表中吗?看这里