Nie będę się dziś rozpisywał na temat wyższości Świąt Bożego Narodzenia na Chanuką, ani tego, czy Oracle jest lepszy od MSSQL. Napiszę zamiast tego o dwóch maleńkich różnicach między tymi silnikami baz danych.
Różnica numer 1: obowiązkowe FROM.
W Oracle zapytanie SELECT musi bezwarunkowo posiadać klauzulę FROM. Bez tego ani rusz. Błąd składni i tyle.
A co, jeżeli nie potrzebujemy żadnego tabelarycznego źródła danych, bo je sobie sami właśnie wyliczyliśmy "w locie"? I tak musimy dodać FROM na końcu. A co po FROM? Jak to co: DUAL. DUAL to taka wirtualna, dynamiczna tabelka, która ma wszystkie możliwe nazwy kolumn i tylko jeden rekord o takich wartościach, jakie sobie zdefiniujemy. Przykład:
SELECT 1+2 AS jeden_plus_dwa FROM DUAL;
W MSSQL natomiast słówko FROM jest opcjonalne. Jeżeli nie potrzebujemy wyszczególniać tabel źródłowych, po prostu je pomijamy:
SELECT 1+2 AS jeden_plus_dwa;
Punkt dla MSSQL za zwięzłość i za to, że nie trzeba pamiętać durnej nazwy (czemu akurat DUAL? Czemu nie SINGLE albo ROAR, albo nawet HRUMPFFF?)
Różnica numer 2: CREATE or REPLACE
Pisząc skrypt tworzący obiekt w bazie danych zawsze należy najpierw sprawdzić, czy ów obiekt już tam istnieje (jeżeli tak, to albo go usunąć i utworzyć na nowo, albo zmodyfikować definicję istniejącego obiektu). W Oracle mamy następującą składnię:
CREATE OR REPLACE VIEW dbo.jakas_nazwa AS
SELECT kolumna
, inna_kolumna
, jeszcze_inna_kolumna
FROM dbo.tabela
WHERE jakis_warunek = jakas_wartosc
OR jakas_kolumna IS NOT NULL;
Powyższe zapytanie DDL utworzy nam obiekt (tabelę, widok, procedurę, funkcję lub cokolwiek innego - w powyższym przykładzie jest to akurat widok) o podanej nazwie, jeżeli ów obiekt jeszcze nie istnieje, lub zmodyfikuje definicję istniejącego obiektu, jeżeli ów już istnieje.
Natomiast w MSSQL trzeba kombinować dookoła:
IF OBJECT_ID('dbo.jakas_nazwa') IS NULL EXECUTE('CREATE VIEW dbo.jakas_nazwa AS SELECT 1 AS x;')
GO
ALTER VIEW dbo.jakas_nazwa AS
SELECT kolumna
, inna_kolumna
, jeszcze_inna_kolumna
FROM dbo.tabela
WHERE jakis_warunek = jakas_wartosc
OR jakas_kolumna IS NOT NULL;
Jak widać trzeba było rozbić zagadnienie na dwa osobne kroki. Wersja Oracle jest bardziej zwięzła, załatwia sprawę w pojedynczej operacji no i jest też mniej błędogenna... Punkt dla Oracle.
Tymczasem zmywak czeka.
Punkt dla zmywaka.
MSSQL: Update…. from
MSSQL: procedura może zwracać kilka record set’ów
E, nie, no wiadomo, różnic jest mnóstwo i generalnie moja sympatia jest po stronie MSSQL, ale jednak są drobiazgi, których mogliby się nauczyć (albo ukraść…) od Oracle 😉
Wiem [np to_char dla dat]. Ale tych rzeczy nie da się prosto zastąpić w Oracle. I ich brak przyzwyczajonych boli.