Cinque differenze tra ambiente Oracle e Sql Server

Parliamo in questo articolo di cinque differenze tra la programmazione SQL in ambiente Sql Server e in ambiente Oracle. Tali differenze sono di fondamentale importanza perché inerenti operazioni frequentissime e, se non conosciute, potrebbero portare a comportamenti inattesi pur senza errori di compilazione.

Utilizzo di Varchar e Varchar2

Per eseguire i nostri test occorre creare due tabelle. Già questo metterà in luce un’importante differenza tra Sql Server e Oracle. Su Sql Server il tipo di colonna relativo a una stringa generica di lunghezza variabile è varchar/nvarchar. Possiamo scrivere dunque il codice

CREATE TABLE TabellaTest (
 campo1 VARCHAR(50) NULL,
 campo2 DECIMAL(18,2) NULL);
INSERT INTO TabellaTest(  
                 campo1,
                 campo2)
VALUES ('test', 35.23);

Le query precedenti vengono eseguite correttamente anche su ambiente Oracle, tuttavia il tipo standard per le colonne alfanumeriche è varchar2/nvarchar2.

Su Oracle scriveremo dunque

CREATE TABLE TabellaTest(
 campo1 VARCHAR2(50) NULL,
 campo2 DECIMAL(18,2) NULL);
INSERT INTO TabellaTest( 
                 campo1,
                 campo2) 
VALUES ('test', 35.23);

A questo link https://www.thecrazyprogrammer.com/2018/01/difference-varchar-varchar2.html trovi un approfondimento sulla differenza in Oracle tra il tipo varchar e il tipo varchar2.

I filtri sono Case Sensitive o Case Insensitive?

Con le relative impostazioni di default, i filtri sui campi di tipo stringa (varchar o varchar2) risultano essere case sensitive su Oracle e case insensitive su Sql Server.

In ambiente Oracle questa query restituirà zero righe

SELECT *
FROM   TabellaTest
WHERE 'TESTO' = 'testo';

Invece su Sql Server il medesimo filtro sarà ininfluente.

Differenze Oracle e Sql Server nel rapporto tra null e stringa vuota

Eseguiamo su entrambi gli ambienti questa update

UPDATE TabellaTest 
SET    campo1 = '';

A questo punto la query seguente restituirà due risultati differenti:

SELECT * 
FROM   TabellaTest
WHERE  campo1 = '';

Su Oracle non c’è distinzione tra la stringa vuota e il null. Di conseguenza la query precedente è equivalente a

SELECT *
FROM   TabellaTest
WHERE  campo1 = NULL;

che restituirà zero righe per via dell’utilizzo del operatore = invece di IS.

Al contrario Sql Server segue il comportamento standard: i due concetti di stringa vuota e null sono distinti e di conseguenza la query iniziale restituirà una riga.

Il Commit delle modifiche avviene implicitamente o esplicitamente?

Su Oracle l’update precedente necessita di un commit per essere reso effettivo.
Con le impostazioni di default, il commit su Sql Server non è necessario e l’update risulta immediatamente permanente, a meno di non aver esplicitato in precedenza l’apertura di una transazione.

N.B. Su Oracle soltanto le operazioni DML necessitano di un commit, l’esecuzione di un’operazione DDL (come la truncate) ha l’effetto di committare essa stessa e anche le DML precedenti.

Come sono gestiti i campi di tipo Date?

Su SQL Server i campi di tipo date incorporano solamente l’informazione relativa ad anno, mese e giorno. Su Oracle tali campo riportano anche ore, minuti e secondi.

Di conseguenza, supponendo che oggi sia il primo gennaio 2020, su SQL Server la seguente condizione sarà vera

WHERE CAST(GETDATE() AS DATE) = '20200101'

al contrario, al netto delle piccole differenze di sintassi, su Oracle risulterà falsa, almeno che non siamo esattamente alla mezzanotte.

Continua a imparare

Torna in alto
Torna su