Wie überprüfe ich, ob varchar2 leer ist?

8

Laut offiziellen 11g-Dokumenten

  

Oracle Database behandelt derzeit einen Zeichenwert mit einer Länge von   Null als Null. Dies dürfte jedoch in Zukunft nicht mehr der Fall sein   Releases, und Oracle empfiehlt, dass Sie keine leeren Strings behandeln   das gleiche wie Nullen.

Betrachten Sie eine Funktion getVersion , die ein varchar2 zurückgibt, das möglicherweise '' :

ist %Vor%

Dies wird auf dem aktuellen Oracle 11g korrekt funktionieren, kann aber brechen, sobald zukünftige Oracle-Versionen '' anders behandeln als null .

Der einzige Weg, den ich sehe, um den obigen Zukunftsbeweis zu machen, ist:

if l_version is null or l_version = '' then

Gibt es einen weniger umständlichen Weg?

    
Roland 27.05.2015, 17:15
quelle

3 Antworten

9

Wenn Sie varchar2 im gesamten Code verwenden, ist l_version is null zukunftssicher.

Oracle hat den Datentyp varchar2 erstellt, als die ANSI-Standards deklarierten, dass varchar NULL und die leere Zeichenfolge als separate Entitäten behandeln sollte. Die Absicht war, dass das Verhalten des varchar2 -Datentyps in Zukunft konsistent bleiben würde, während varchar in der Zukunft die neue Standard-NULL-Vergleichssemantik verwenden könnte. Natürlich sind heute varchar und varchar2 Synonyme für einander und das seit mindestens ein paar Jahrzehnten, so dass die Wahrscheinlichkeit, dass Oracle das Verhalten des varchar -Datentyps in der Zukunft ändert, ziemlich niedrig ist.

Wenn Sie sich die Dokumentation für VARCHAR2 und VARCHAR ansehen Datentypen , es wird über die Vergleichssemantik für VARCHAR gesprochen, die sich möglicherweise in der Zukunft ändert. Leider ist es nicht explizit, dass die Vergleichssemantik, über die sie sprechen, die Äquivalenz (oder das Fehlen davon) zwischen NULL und der leeren Zeichenfolge ist. Aber da VARCHAR ein ANSI-Standarddatentyp ist und der einzige Unterschied in VARCHAR Vergleichssemantik zwischen Oracle und dem ANSI-Standard ist, ob die leere Zeichenkette NULL ist, das ist die allgemein akzeptierte Interpretation.

  

Verwenden Sie nicht den VARCHAR-Datentyp. Verwenden Sie stattdessen den VARCHAR2-Datentyp.   Obwohl der VARCHAR-Datentyp derzeit gleichbedeutend mit VARCHAR2 ist,   Der VARCHAR-Datentyp wird als neu definiert   Datentyp, der für Zeichenketten mit variabler Länge verwendet wird   verschiedene Vergleichssemantiken.

    
Justin Cave 27.05.2015, 18:13
quelle
4

Wenn sich das Verhalten ändert, wollen Sie dann nicht zwischen leerer Zeichenkette und Null unterscheiden können, wenn so etwas möglich ist? Mit anderen Worten, ein zukunftssicherer Code, der leere Strings und Nullen als denselben behandelt, wird wahrscheinlich in der Zukunft sowieso wieder auftauchen müssen.

Außerdem gibt es derzeit etwa 100 Milliarden Billionen Null-Strings, die weltweit in Oracle-Datenbanken gespeichert sind und weiterhin null sein werden.

Also mein Rat ist es zu vergessen, und benutze einfach IS NULL.

    
David Aldridge 27.05.2015 18:11
quelle
0

Klingt wie ein Anwalt in Oracles Dokumentation. Ich kann mir in einer Million Jahren nicht vorstellen, dass Oracle plötzlich ändern würde, wie sie mit varchar2 mit leeren Strings umgehen, eine TON Code würde brechen (und vieles davon still). Diese Aussage in den Dokumenten scheint für alle Fälle ein "Cover your a $$" zu sein. Also, benutze einfach "is null" und mach dir keine Sorgen. Wenn überhaupt, ändern sie das varchar-Verhalten, nicht varchar2.

Meine 2 Cent sowieso.

    
tbone 27.05.2015 20:27
quelle

Tags und Links