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

Sertakan nilai RowId di Tabel Bersarang

ROWID adalah kolom semu , ini bukan bagian dari tampilan kamus data tabel (misalnya tidak muncul di dba_tab_columns ), jadi tidak termasuk dalam %rowtype . Catatan PL/SQL - yang Anda buat untuk tabel PL/SQL - tidak memiliki penyimpanan fisik, jadi tidak ada rowid nyata atau semu.

Jika Anda benar-benar ingin menyimpan ID baris dalam catatan/tabel, Anda harus mendeklarasikan jenisnya secara eksplisit:

create or replace package dat_pkg is

    type typ_dat_rec is record (
        data_id     data_test.data_id%type,
        data_value  data_test.data_value%type,
        data_rowid  rowid);

    type typ_dat_tst is table of data_test%rowtype index by pls_integer;

    procedure proc_test (p_dat  typ_dat_tst);

end dat_pkg;
/

Anda tidak dapat memanggil bidang rekaman hanya rowid karena itu adalah tipe data, jadi saya mengawalinya dengan data_ tetapi Anda mungkin lebih suka sesuatu yang lain. Dan kemudian Anda perlu menggunakan nama bidang itu di badan paket Anda, jelas:

create or replace package body dat_pkg is

    procedure proc_test (p_dat  typ_dat_tst)
    is
    begin

        for i in 1..p_dat.count loop

            update  data_test        
            set     data_value  = p_dat(i).data_value  
            where   data_id     = p_dat(i).data_id
            and     rowid       = p_dat(i).data_rowid;

        end loop;

    end proc_test;

end dat_pkg;
/

Anda dapat, seperti yang Anda sarankan, menyimpan seluruh jenis baris dan ID baris sebagai dua bidang dalam jenis catatan:

create or replace package dat_pkg is

    type typ_dat_rec is record (
        data_rec    data_test%rowtype,
        data_rowid  rowid);

    type typ_dat_tst is table of typ_dat_rec index by pls_integer;

    procedure proc_test (p_dat  typ_dat_tst);

end dat_pkg;
/

tapi itu membuat merujuk ke bidang sedikit lebih canggung:

...
        for i in 1..p_dat.count loop

            update  data_test        
            set     data_value  = p_dat(i).data_rec.data_value  
            where   data_id     = p_dat(i).data_rec.data_id
            and     rowid       = p_dat(i).data_rowid;

        end loop;
...

dan itu mungkin akan membuat mengisi koleksi lebih canggung juga. Karena Anda tetap harus mengetahui semua nama kolom/bidang untuk dapat merujuknya dalam loop, saya tidak yakin ada banyak keuntungan, tetapi Anda mungkin merasa lebih rapi.

Tentu saja, melakukan ini sama sekali mengasumsikan koleksi Anda sedang diisi dari subset data dari tabel di DB dan sesi genap yang sama, karena rowid baris dapat berubah seiring waktu. Anda mungkin juga ingin melihat forall sintaks untuk menggantikan for . Anda loop, tergantung pada apa yang sebenarnya Anda lakukan. (Tetapi Anda juga harus mempertimbangkan apakah Anda memerlukan koleksi sama sekali - jika Anda hanya mengisi koleksi dan kemudian menggunakannya untuk pembaruan, maka satu pembaruan SQL akan lebih cepat lagi...)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Melihat aplikasi oracle dan mendapatkan:java.lang.ClassNotFoundException:oracle.forms.engine.Main

  2. Kesalahan (2,7):PLS-00428:klausa INTO diharapkan dalam pernyataan SELECT ini

  3. Bagaimana cara menambahkan cluster pada kunci komposit?

  4. Format nilai total ke mata uang dengan 2 tempat desimal

  5. Menggunakan IF EXISTS (SELECT ...) dalam pemicu BEFORE INSERT (Oracle)