Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Kode mana yang memiliki korespondensi dalam db

Buat tabel eksternal pada file CSV Anda. Ini adalah hal-hal yang sangat rapi yang memungkinkan kita untuk menanyakan isi file OS dalam SQL. Cari tahu lebih lanjut .

Maka itu masalah sederhana untuk mengeluarkan kueri:

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)

Kinerja adalah masalah konteks. Dalam hal ini tergantung pada seberapa sering data dalam CSV berubah dan seberapa sering kita perlu menanyakannya. Jika file diproduksi sekali sehari dan kita hanya perlu memeriksa nilainya setelah dikirimkan maka tabel eksternal adalah solusi yang paling efisien. Tetapi jika kumpulan data ini adalah repositori permanen yang perlu sering ditanyakan maka biaya menulis ke tabel heap jelas dibenarkan.

Bagi saya, file CSV yang terdiri dari banyak ID dan tidak ada yang terdengar seperti data sementara dan sesuai dengan kasus penggunaan untuk tabel eksternal. Tetapi OP mungkin memiliki persyaratan tambahan yang belum mereka sebutkan.

Berikut adalah pendekatan alternatif yang tidak memerlukan pembuatan objek database permanen. Akibatnya itu kurang elegan, dan mungkin akan berkinerja lebih buruk.

Ia membaca file CSV dengan susah payah menggunakan UTL_FILE dan mengisi koleksi berdasarkan SYSTEM.NUMBER_TBL_TYPE, koleksi yang telah ditentukan sebelumnya (tabel bersarang NUMBER) yang harus tersedia di database Oracle Anda.

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;

Catatan:Saya belum menguji kode ini. Prinsipnya bagus tetapi detailnya mungkin perlu di-debug;)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memperbarui oracle tabel yang dipartisi

  2. Oracle:temukan angka terbesar dalam satu string

  3. Penyedia data Oracle mematok proses pekerja IIS saat situs web dihentikan

  4. Deteksi kesalahan sqlplus dalam skrip batch dos?

  5. Gabung dalam vs Dimana