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

kursor di pemicu

Karena loop (yang tidak memiliki klausa keluar - mudah-mudahan Anda baru saja kehilangan menerjemahkan ini menjadi pertanyaan), Anda akan mencoba memasukkan catatan ke pstn_matrix untuk setiap merekam kursor kembali, apakah ada yang cocok :new.person_id atau tidak; dan jika ada kecocokan Anda juga akan melakukan update . Yang mungkin bukan yang Anda inginkan, dan Anda mungkin mendapatkan pelanggaran kendala antara lain. Anda juga tidak menyetel bidang penghitung Anda - jika itu tidak dapat dibatalkan maka itu akan salah. Tapi Anda belum mengatakan kesalahan apa, jika ada, yang Anda dapatkan.

Jika Anda harus melakukan ini melalui pemicu maka Anda dapat memeriksa apakah ada baris untuk orang baru sama sekali:

DECLARE
  v_temp postn_matrix.person_id%TYPE;
BEGIN
  IF INSERTING THEN
    select max(person_id) into v_temp
    from postn_matrix
    where person_id = :new.person_id;

    if v_temp is null then
      -- no record found, so insert one
      insert into postn_matrix (person_id, position_count)
      values (:new.person_id, 1);
    else
      -- record exists, so update
      update postn_matrix ...
    end if;
  ...

... atau gunakan merge .

Tapi saya tidak suka model ini, dan Anda menyiapkan potensi perbedaan data dengan modifikasi bersamaan ke tabel dasar. Mencoba mempertahankan hitungan seperti ini tidak sesederhana kelihatannya.

Saya biasanya lebih suka membuat tampilan ini, yang akan selalu terbarui dan tidak memerlukan pemicu yang memperumit hal-hal:

create view postn_matrix as
  select person_id, count(*)
  from basetable
  group by person_id;

Tentu saja, saya mungkin salah menafsirkan atau menyederhanakan apa yang dilakukan tabel dasar Anda dan apa yang Anda butuhkan postn_matrix untuk. Tampaknya sedikit sepele untuk dimiliki bahkan sebagai pandangan. Jika Anda memiliki person yang terpisah dan person_position tabel, katakanlah, lalu Anda dapat menambahkan gabungan luar untuk melihat orang tanpa posisi:

create view postn_matrix as
  select p.person_id, count(pp.position_id)
  from person p
  left join person_position pp on pp.person_id = p.person_id
  group by p.person_id;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Java untuk OS X 2013-004 mempengaruhi (break) aplikasi Swing?

  2. Output Oracle berbeda di SQL Developer dan excel

  3. Baca ARRAY dari STRUCT yang dikembalikan oleh prosedur tersimpan

  4. Codeigniter dan konstanta Oracle tidak terdefinisi:OCI_COMMIT_ON_SUCCESS

  5. ORA-22905 - saat menanyakan jenis tabel dengan pernyataan pilih