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

Prosedur Penyelesaian tanpa parameter

Selain komentar dan jawaban yang telah Anda berikan, saya yakin Anda telah membuat prosedur Anda terlalu rumit. Anda melakukan hal-hal yang sangat prosedural, daripada berpikir dalam set sebagaimana mestinya. Anda juga mendapatkan kolom agregat dalam tiga kueri yang pada dasarnya identik (misalnya tabel yang sama, kondisi gabungan, dan predikat) - Anda dapat menggabungkan semuanya untuk mendapatkan tiga hasil dalam satu kueri.

Sepertinya Anda mencoba menyisipkan ke tabel pembelian historis klien jika baris belum ada untuk klien itu, jika tidak, Anda memperbarui baris. Itu segera meneriakkan "pernyataan MERGE" kepada saya.

Menggabungkan semua itu, saya pikir prosedur Anda saat ini seharusnya hanya berisi satu pernyataan gabungan:

MERGE INTO clienthistoricalpurchases tgt
  USING (SELECT clients.client_id,
                COUNT(DISTINCT od.productid) distinct_products,
                COUNT(od.productid) total_products,
                SUM((od.unitprice * od.quantity) - od.discount) proposed_new_balance
         FROM   orderdetails od
         INNER  JOIN orders
         ON     orderdetails.orderid = orders.orderid
         INNER  JOIN clients
         ON     orders.clientid = clients.clientid
         GROUP BY clients.client_id) src
  ON (tgt.clientid = src.client_id)
WHEN NOT MATCHED THEN
  INSERT (tgt.clientid,
          tgt.distinctproducts,
          tgt.totalproducts,
          tgt.totalcost) 
  VALUES (src.clientid,
          src.distinct_products,
          src.total_products,
          src.proposed_new_balance)
WHEN MATCHED THEN
  UPDATE SET tgt.distinctproducts = src.distinct_products,
             tgt.totalproducts = src.total_products,
             tgt.totalcost = src.proposed_new_balance;

Namun, saya memiliki beberapa kekhawatiran tentang logika dan/atau model data Anda saat ini.

Sepertinya Anda mengharapkan paling banyak satu baris per clientid muncul di clienthistorispembelian. Bagaimana jika clientid memiliki dua atau lebih pesanan yang berbeda? Saat ini Anda akan menimpa setiap baris yang ada.

Juga, apakah Anda benar-benar ingin menerapkan logika ini di semua pesanan setiap kali dijalankan?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menemukan catatan dengan rentang tanggal yang tumpang tindih secara rekursif di Oracle DB

  2. Cara memanggil prosedur tersimpan di JDBC

  3. Kombinasi dari Satu Tabel, Dikelompokkan Berdasarkan Nilai Kolom

  4. Koneksi tunggal dengan Oracle

  5. Bisakah Oracle SQL*Loader memproses XML?