Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Mã nào có sự tương ứng trong db

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách giải quyết ORA-00939:quá nhiều đối số cho lỗi hàm?

  2. Nối các số trong biểu thức cột ảo ném ORA-12899:giá trị quá lớn cho cột

  3. Lỗi kết nối ODBC Oracle (sử dụng trình điều khiển ODBC có sẵn của oracle)

  4. Cập nhật hàng loạt Oracle bằng ODP.NET

  5. Oracle Cách liệt kê những ngày cuối cùng của tháng giữa 2 ngày