MSSQL vs Oracle: mały remis

https://xpil.eu/HPdmG

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.

https://xpil.eu/HPdmG

3 komentarze

    1. 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 😉

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.