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?
Odpowiedzi:
Jednym ze sposobów, aby to zrobić, byłyby typy obiektów , w tym przypadku typ byłby podobny do twojego
#t1
. Musiałby więc być gdzieś zdefiniowany, ale nie musiałby być globalny, mógłby to być nawet schemat lub procedura. Najpierw możemy stworzyć typ:Teraz skonfiguruj przykładowe dane:
I utwórz funkcję nad tymi danymi, zwracając nasz „tymczasowy” typ:
I w końcu:
Jak widać, jest to dość niezgrabne (i używa pseudo-funkcji kolekcji , co jest w najlepszym razie niejasną funkcją!), Jak zawsze mówię, przenoszenie z DB do DB nie polega tylko na składni i słowach kluczowych w ich dialektach SQL , rzeczywista trudność wiąże się z różnymi założeniami (w przypadku SQL Server, że kursory są drogie, a ich używania unikano / obchodzono się za wszelką cenę).
źródło
Jeśli opcja przypadku nie jest wystarczająco elastyczna, możesz zbiorczo zebrać dane w swojej procedurze i manipulować tablicą (tablicami).
źródło
SELECT
jest ostatnią rzeczą w proc przechowywanym w T-SQL, to właśnie to zwraca)