MSSQL vs Oracle: mały remis

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.

Autor: xpil

Po czterdziestce. Żonaty. Dzieciaty. Komputerowiec. Krwiodawca. Emigrant. Rusofil. Lemofil. Sarkastyczny. Uparty. Mól książkowy. Ateista. Apolityczny. Nie oglądam TV. Uwielbiam matematykę. Walę prosto z mostu. Gram na paru instrumentach. Lubię planszówki. Słucham bluesa, poezji śpiewanej i kapel a’capella. || Kliknij tutaj po więcej szczegółów ||

Dodaj komentarz

3 komentarzy do "MSSQL vs Oracle: mały remis"

Powiadom o
avatar
Sortuj wg:   najnowszy | najstarszy | oceniany
Butter
Gość

MSSQL: Update…. from
MSSQL: procedura może zwracać kilka record set’ów

wpDiscuz