Simpan hasil kueri minus dengan beberapa kolom dalam variabel di Oracle PL / SQL

Aug 18 2020

Saya menggunakan kode di bawah ini untuk mengambil ID Proyek tambahan yang ada di TABLE_ONE dibandingkan dengan TABLE_TWO (sumber Store hasil kueri minus (daftar varchars) dalam variabel di Oracle PL / SQL )

DECLARE 
  l_missing_id_list SYS.ODCINUMBERLIST;
BEGIN
  SELECT project_id
  BULK COLLECT INTO l_missing_id_list
  FROM 
    (
    SELECT t1.project_id FROM table_one t1
    MINUS
    SELECT t2.project_id FROM table_two t2 );
    
  FORALL i IN l_missing_id_list.FIRST..l_missing_id_list.LAST
    INSERT INTO table_two VALUES ( l_missing_id_list(i) );
    
  COMMIT;
  
  -- Values are now inserted and you have the list of IDs in l_missing_id_list to add to your email.
END;

Sekarang saya ingin menambahkan Nama Proyek yang sesuai juga ke tabel kedua. Project_id tambahan apa pun yang ada di TABLE_ONE dibandingkan dengan TABLE_TWO harus disisipkan di TABLE_TWO bersama dengan Nama Proyek yang sesuai. Bagaimana cara melakukannya? Harap dicatat bahwa saya perlu menyimpan hasil kueri minus dalam variabel karena saya akan melakukan beberapa langkah dengan hasilnya.

Jawaban

1 MatthewMcPeak Aug 18 2020 at 21:11

SYS.ODCINUMBERLISThanyalah sebuah daftar di mana setiap record memiliki satu nomor. Anda perlu menggunakan tipe rekaman baru untuk menyimpan beberapa bidang di setiap baris.

Anda dapat menentukan tipe record untuk digunakan sebagai pengganti SYS.ODCINUMBERLIST. Tapi saya akan cenderung untuk memindahkan SELECTpernyataan menjadi kursor eksplisit, sehingga Anda bisa mendefinisikan tipe baru sebagai kursor %ROWTYPE. Dengan cara itu, tipe record Anda dan pernyataan select selalu konsisten, tetapi sedikit mengubah struktur kode Anda.

Inilah pendekatan itu:

DECLARE 

  CURSOR c_select IS
      SELECT project_id, project_name
      FROM 
        (
          SELECT t1.project_id, t1.project_name FROM table_one t1
          MINUS
          SELECT t2.project_id, t2.project_name FROM table_two t2 );

  TYPE l_missing_row_list_typ IS TABLE OF c_select%ROWTYPE;
  l_missing_row_list l_missing_row_list_typ;
  
BEGIN
  OPEN c_select;
  FETCH c_select BULK COLLECT INTO l_missing_row_list;
  CLOSE c_select;
  
  FORALL i IN l_missing_row_list.FIRST..l_missing_row_list.LAST
    INSERT INTO table_two VALUES ( l_missing_row_list(i).project_id, l_missing_row_list(i).project_name );
    
  COMMIT;
  
  -- Values are now inserted and you have the list of IDs in l_missing_row_list to add to your email.
END;

Satu catatan tentang BULK COLLECT(baik di sini dan di posting asli Anda) - data yang Anda kumpulkan secara massal disimpan dalam memori PGA. Jadi jangan gunakan kode ini karena jika ada perubahan jumlah record baru akan tidak masuk akal (mungkin lebih dari beberapa ribu).