Pengembang C # didorong oleh manajemen untuk menulis prosedur tersimpan SQL Server sering menghasilkan prosedur seperti ini
create table #t1 (...);
insert into #t1 Select ... from table_a where ...;
insert into #t1 Select ... from table_b where ...;
update #t1 Set ... = ... where ...
Select * from #t1;
Pernyataan tunggal agak sederhana dan metode ini membuatnya menghasilkan hasil yang benar.
Seringkali tugas saya adalah memigrasikan prosedur tersebut ke Oracle.
Mari kita hadapi fakta-fakta berikut.
- Untuk tabel sementara yang berbeda di SQL Server sepenuhnya independen dan dapat memiliki struktur ad hoc.
- Oracle tabel bersama global adalah objek global dan semua menggunakan banyak struktur tabel yang sama. Memodifikasi struktur ini tidak mungkin, sementara itu digunakan di mana saja.
Salah satu hal yang saya pelajari dari Oracle dba, adalah untuk menghindari penggunaan tabel sementara kapan pun memungkinkan. Bahkan kinerja pada SQL server mendapat manfaat dari modifikasi tersebut.
Ganti sisipan individu dengan serikat
Dalam kasus yang paling sederhana, hal di atas dapat diubah menjadi sesuatu seperti
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
Penggunaan fungsi
Baik fungsi skalar maupun fungsi bernilai tabel dapat membantu mengubah prosedur Anda menjadi satu kueri dari formulir di atas.
Ekspresi Common Table alias Anjak Subquery
Anjak Subquery hampir merupakan yang terbaik yang ditawarkan Oracle untuk menghindari tabel sementara. Menggunakannya migrasi SQL Server ke Oracle sekali lagi agak mudah. Ini membutuhkan SQL Server 2005 dan di atasnya.
Modifikasi ini meningkatkan versi SQL Server dan dalam banyak kasus membuat migrasi langsung. Dalam kasus lain resor ke tabel sementara global memungkinkan untuk melakukan migrasi dalam waktu terbatas, tetapi kurang memuaskan.
Apakah ada cara lebih lanjut untuk menghindari penggunaan tabel sementara global di Oracle?
Jawaban:
Salah satu cara untuk melakukan ini adalah Jenis Objek , dalam hal ini jenisnya akan sesuai dengan Anda
#t1
. Jadi itu perlu didefinisikan di suatu tempat tetapi tidak perlu global, itu bisa per-skema atau bahkan per-prosedur. Pertama, kita bisa membuat tipe:Sekarang siapkan beberapa data sampel:
Dan buat fungsi atas data ini dengan mengembalikan tipe "sementara" kami:
Dan akhirnya:
Seperti yang Anda lihat ini cukup kikuk (dan menggunakan koleksi pseudo-fungsi , yang merupakan fitur tidak jelas di saat terbaik!), Seperti yang selalu saya katakan, porting dari DB ke DB bukan hanya tentang sintaks dan kata kunci dalam dialek SQL mereka , kesulitan sebenarnya datang dalam asumsi dasar yang berbeda (dalam kasus SQL Server, bahwa kursor mahal dan penggunaannya dihindari / dikerjakan di semua biaya).
sumber
Jika kasus opsi tidak cukup fleksibel Anda bisa bulk mengumpulkan data dalam prosedur dan memanipulasi array (s).
sumber
SELECT
adalah hal terakhir dalam T-SQL proc yang disimpan, itulah yang dikembalikan)