Programista C # zachęcony przez kierownictwo do pisania procedur przechowywanych SQL Server często tworzy takie procedury
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;
Pojedyncza instrukcja jest raczej prosta i ta metoda sprawia, że dają one prawidłowe wyniki.
Często moim zadaniem jest migracja takich procedur do Oracle.
Spójrzmy na następujące fakty.
- Różne tabele tymczasowe w SQL Server są całkowicie niezależne i mogą mieć dowolną strukturę ad hoc.
- Globalne wspólne tabele Oracle są obiektami globalnymi i wszystkie zastosowania mają tę samą strukturę tabel. Modyfikacja tej struktury jest niemożliwa, ponieważ jest używana w dowolnym miejscu.
Jedną z rzeczy, których nauczyłem się od Oracle dba, było unikanie używania tabel tymczasowych, gdy tylko jest to możliwe. Nawet wydajność na serwerze SQL korzysta z takich modyfikacji.
Zastąp poszczególne wkładki związkami
W najprostszym przypadku powyższe można przekształcić w coś podobnego
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
Korzystanie z funkcji
Zarówno funkcje skalarne, jak i funkcje cenione w tabeli mogą pomóc w przekształceniu procedury w pojedyncze zapytanie powyższej formy.
Typowe wyrażenia tabelowe zwane faktoringiem podzapytania
Faktoring podzapytania to prawie najlepsza oferta Oracle, aby uniknąć tymczasowych tabel. Za jego pomocą migracja SQL Servera do Oracle jest znów dość łatwa. Wymaga to programu SQL Server 2005 i nowszych wersji.
Te modyfikacje poprawiają wersję programu SQL Server, a w wielu przypadkach migracja jest prosta. W innych przypadkach zastosowanie globalnych tabel tymczasowych umożliwia migrację w ograniczonym czasie, ale jest mniej satysfakcjonujące.
Czy istnieją inne sposoby na uniknięcie korzystania z globalnych tabel tymczasowych w Oracle?