Biasanya, Anda hanya akan bergabung dengan dua tabel.
FOR some_cursor IN (SELECT s.col1,
s.col2
FROM sometable s
JOIN temp_table t ON (s.col3 = t.col1))
LOOP
<<do something>>
END LOOP
Karena Anda mengkhawatirkan efisiensi, bagaimanapun
- Apakah
TEMP_TABLEbenar-benar meja sementara? Jika demikian, mengapa? Sangat jarang Oracle benar-benar perlu menggunakan tabel sementara sehingga membuat saya curiga bahwa Anda mungkin melakukan sesuatu yang tidak efisien untuk mengisi tabel sementara. - Mengapa Anda memiliki kursor
FORloop untuk memproses data dariTEMP_TABLE? Pemrosesan baris demi baris adalah cara paling lambat untuk melakukan apa pun di PL/SQL sehingga umumnya akan dihindari jika Anda khawatir tentang efisiensi. Dari sudut pandang kinerja, Anda ingin memaksimalkan SQL sehingga daripada melakukan loop yang melakukan serangkaian baris tunggalINSERTatauUPDATEoperasi, Anda akan melakukan satuINSERTatauUPDATEyang memodifikasi seluruh rangkaian baris. Jika Anda benar-benar perlu memproses data dalam potongan, di situlah koleksi PL/SQL dan pemrosesan massal akan berperan, tetapi itu tidak akan seefisien SQL biasa. - Mengapa Anda memiliki
DISTINCTdalam kueri Anda terhadapTEMP_TABLE? Apakah Anda benar-benar berharap akan ada duplikatbig_idnilai yang tidak salah? Sebagian besar waktu, orang menggunakanDISTINCTsalah baik untuk menutupi masalah di mana data telah digabungkan secara tidak benar atau di mana Anda memaksa Oracle untuk melakukan pengurutan yang mahal untuk berjaga-jaga jika data yang salah dibuat di masa mendatang ketika batasan akan menjadi cara yang lebih tepat untuk melindungi diri Anda sendiri.