Tạo một bảng bên ngoài trên tệp CSV của bạn. Đây là những thứ rất gọn gàng cho phép chúng tôi truy vấn nội dung của tệp hệ điều hành trong SQL. Tìm hiểu thêm .
Sau đó, vấn đề đơn giản là đưa ra một truy vấn:
select csv.id
, case ( when tgt.id is null then 'invalid' else 'valid') end as valid_id
from your_external_tab csv
left join target_table tgt on (csv.id = tgt.id)
Hiệu suất là một vấn đề của bối cảnh. Trong trường hợp này, điều đó phụ thuộc vào tần suất dữ liệu trong CSV thay đổi và tần suất chúng ta cần truy vấn nó. Nếu tệp được tạo mỗi ngày một lần và chúng tôi chỉ cần kiểm tra các giá trị sau khi tệp đã được phân phối thì bảng bên ngoài là giải pháp hiệu quả nhất. Nhưng nếu tập dữ liệu này là một kho lưu trữ vĩnh viễn cần được truy vấn thường xuyên thì chi phí ghi vào bảng heap rõ ràng là hợp lý.
Đối với tôi, một tệp CSV bao gồm một loạt các ID và không có gì khác giống như dữ liệu tạm thời và làm mềm trường hợp sử dụng cho các bảng bên ngoài. Nhưng OP có thể có các yêu cầu bổ sung mà họ chưa đề cập.
Đây là một cách tiếp cận thay thế không yêu cầu tạo bất kỳ đối tượng cơ sở dữ liệu vĩnh viễn nào. Do đó, nó kém thanh lịch hơn và có thể sẽ hoạt động kém hơn.
Nó đọc tệp CSV một cách khó hiểu bằng UTL_FILE và điền vào một bộ sưu tập dựa trên SYSTEM.NUMBER_TBL_TYPE, một bộ sưu tập được xác định trước (bảng NUMBER lồng nhau) sẽ có sẵn trong cơ sở dữ liệu Oracle của bạn.
declare
ids system.number_tbl_type;
fh utl_file.file_handle;
idx pls_integer := 0;
n pls_integer;
begin
fh := utl_file.fopen('your_data_directory', 'your_data.csv', 'r');
begin
utl_file.get_line(fh, n);
loop
idx := idx + 1;
ids.extend();
ids(idx) := n;
utl_file.get_line(fh, n);
end loop;
exception
when no_data_found then
if utl_file.is_open(fh) then
utl_file.fclose(fh);
end if;
when others then
raise;
end;
for id_recs in in ( select csv.column_value
, case ( when tgt.id is null then 'invalid' else 'valid') end as valid_id
from (select * from table(ids)) csv
left join target_table tgt on (csv.column_value = tgt.id)
) loop
dbms_output.put_line '(ID '||id_recs.column_value || ' is '||id_recs.valid_id);
end loop;
end;
Lưu ý:Tôi chưa thử nghiệm mã này. Nguyên tắc là âm thanh nhưng các chi tiết có thể cần gỡ lỗi;)