Cinque differenze tra ambiente Oracle e Sql Server

Parliamo in questo articolo di cinque differenze tra la programmazione SQL su ambiente Sql Server e su 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.

 

1) Varchar vs Varchar2

Per eseguire i nostri test occorre creare due tabelle. Già questo mette in luce un’importante differenza tra Sql Server e Oracle.
Su Sql Server il tipo di colonna relativo ad 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
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
values (‘test’, 35.23)

 

2) Filtri 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.

 

3) 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    TabellaOracle
where campo1=”

Su Oracle non c’è distinzione tra la stringa vuota e il null. Di conseguenza la query precedente è equivalente a
select    *
from    TabellaOracle
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.

 

4) Commit implicito o esplicito?

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.

 

5) 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) = ‘2020-01-01’

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

 

Articoli correlati

Visto che l’articolo vi è piaciuto molto, ne abbiamo scritto un altro con cinque nuove differenze da conoscere per lavorare correttamente su Oracle e Sql Server.