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?