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