2015-05-27 16 views
8

According to official 11g docsQual è il modo corretto di verificare se varchar2 è vuoto?

Oracle Database attualmente considera un valore di carattere con una lunghezza di zero come nullo. Tuttavia, questo potrebbe non continuare ad essere vero nelle future versioni di e Oracle consiglia di non considerare le stringhe vuote uguali a null.

consideri una funzione getVersion che restituisce un varchar2 che potrebbe eventualmente essere '':

l_version := x.getVersion; 
if l_version is null then 
    return 'V.1.0'; 
end if; 

questo funzionerà correttamente sul corrente 11g di Oracle, ma potrebbe rompere al più presto le future versioni di Oracle trattano '' in modo diverso rispetto null .

L'unico modo che vedo a fare la prova di futuro sopra è:

if l_version is null or l_version = '' then

Esiste un modo meno ingombrante?

+1

seguo anche lo stesso "se l_version è null o l_version = '' then" – Sachu

+0

@Alex Sì, certo che hai ragione. Stavo facendo il buffone con quel commento:/lo rimuoverò in pochissimo tempo ... –

risposta

9

Supponendo che si stia utilizzando varchar2 in tutto il codice, l_version is null sarà a prova di futuro.

Oracle ha creato il tipo di dati varchar2 quando gli standard ANSI hanno dichiarato che varchar deve trattare NULL e la stringa vuota come entità separate. L'intenzione era che il comportamento del tipo di dati varchar2 rimanga coerente andando avanti mentre varchar in futuro potrebbe utilizzare la nuova semantica di confronto NULL standard. Naturalmente, oggi varchar e varchar2 sono sinonimi l'uno dell'altro e sono stati per almeno un paio di decenni, quindi le probabilità che Oracle cambi in realtà il comportamento del tipo di dati varchar in futuro sono piuttosto basse.

Quando si guarda lo documentation for the VARCHAR2 and VARCHAR data types, si parla della semantica di confronto per VARCHAR che potrebbe cambiare in futuro. Sfortunatamente, non è esplicito che la semantica di confronto di cui stanno parlando sia l'equivalenza (o la sua mancanza) tra NULL e la stringa vuota. Ma poiché VARCHAR è un tipo di dati standard ANSI e l'unica differenza nella semantica di confronto VARCHAR tra Oracle e lo standard ANSI è se la stringa vuota è NULL, questa è l'interpretazione generalmente accettata.

Non utilizzare il tipo di dati VARCHAR. Utilizzare invece il tipo di dati VARCHAR2. Sebbene il tipo di dati VARCHAR sia attualmente sinonimo di VARCHAR2, , il tipo di dati VARCHAR è programmato per essere ridefinito come un tipo di dati separato utilizzato per stringhe di caratteri a lunghezza variabile rispetto alla semantica di confronto diversa da .

4

Se il comportamento cambia, non vorrete essere in grado di distinguere tra stringa vuota e null quando una cosa del genere è possibile? In altre parole, il futuro codice di prova che considera stringhe vuote e null come lo stesso avrà probabilmente bisogno di essere rivisitato in futuro.

Inoltre, ci sono attualmente qualcosa come 100 miliardi di miliardi di stringhe null archiviate nei database Oracle in tutto il mondo che continueranno ad essere nulle.

Quindi il mio consiglio è di dimenticarlo, e basta usare IS NULL.

+0

Nel mio particolare esempio non voglio distinguere. Se 'getVersion' restituisce' null' o un vuoto 'varchar2', inserirò un valore predefinito hardcoded (vedi il codice nella domanda). – Roland

+0

Certo: sto solo mirando al problema più ampio. –

0

Sembra che un avvocato abbia avuto accesso alla documentazione di Oracle. Non riesco a immaginare in un milione di anni che Oracle cambi improvvisamente il modo in cui gestiscono le stringhe vuote con varchar2, una tonnellata di codice si romperebbe (e in gran parte in silenzio). Questa dichiarazione nei documenti sembra essere un "cover your a $$" per ogni evenienza. Quindi, continua a usare "è nullo" e non preoccuparti. Se mai, cambieranno il comportamento varchar, non varchar2.

I miei 2 cent in ogni caso.

Problemi correlati