characters oracle plsql varchar varchar2

oracle - characters - ¿Cuál es la forma correcta de verificar si varchar2 está vacío?



oracle varchar2 byte vs char (3)

De acuerdo con documentos oficiales 11g

Oracle Database actualmente trata un valor de carácter con una longitud de cero como nulo. Sin embargo, esto puede no continuar siendo cierto en versiones futuras, y Oracle recomienda que no trate las cadenas vacías lo mismo que las nulas.

Considere una función getVersion que devuelve un varchar2 que posiblemente sea '''' :

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

Esto funcionará correctamente en Oracle 11g actual, pero podría fallar tan pronto como las futuras versiones de Oracle consideren '''' diferente a null .

La única forma en que veo hacer la prueba futura es:

if l_version is null or l_version = '''' then

¿Hay alguna manera menos engorrosa?


Parece que un abogado se metió en la documentación de Oracle. No puedo imaginar en un millón de años que Oracle cambiaría de repente la forma en que manejan las cadenas vacías con varchar2, una TONELADA de código se rompería (y gran parte de ella en silencio). Esta declaración en los documentos parece ser un "cover your a $$" por si acaso. Entonces, simplemente continúe usando "es nulo" y no se preocupe. En todo caso, cambiarán el comportamiento varchar, no varchar2.

Mis 2 centavos de todos modos.


Si el comportamiento cambia, ¿no va a querer poder distinguir entre cadena vacía y nula cuando tal cosa es posible? En otras palabras, un código a prueba de futuro que trate cadenas vacías y nulos como el mismo probablemente necesite una nueva visita en el futuro de todos modos.

Además, actualmente hay algo así como 100 mil billones de cadenas nulas almacenadas en bases de datos de Oracle en todo el mundo que continuarán siendo nulas.

Así que mi consejo es olvidarse de eso, y simplemente usar IS NULL.


Suponiendo que está utilizando varchar2 todo su código, l_version is null será a prueba de futuro.

Oracle creó el tipo de datos varchar2 cuando las normas ANSI declararon que varchar debería tratar NULL y la cadena vacía como entidades separadas. La intención era que el comportamiento del tipo de datos varchar2 se mantuviera constante en el futuro, mientras que varchar en el futuro podría usar la nueva semántica de comparación estándar NULL. Por supuesto, hoy varchar y varchar2 son sinónimos el uno para el otro y lo han sido durante al menos un par de décadas, por lo que las probabilidades de que Oracle realmente cambie el comportamiento del tipo de datos varchar en el futuro es bastante bajo.

Cuando mira la documentación para los tipos de datos VARCHAR2 y VARCHAR , habla de la semántica de comparación para VARCHAR posiblemente cambie en el futuro. Desafortunadamente, no es explícito que la semántica de comparación de la que están hablando es la equivalencia (o la falta de ella) entre NULL y la cadena vacía. Pero dado que VARCHAR es un tipo de datos ANSI estándar y la única diferencia en la semántica de comparación VARCHAR entre Oracle y el estándar ANSI es si la cadena vacía es NULL, esa es la interpretación generalmente aceptada.

No use el tipo de datos VARCHAR. Utilice el tipo de datos VARCHAR2 en su lugar. Aunque el tipo de datos VARCHAR es actualmente sinónimo de VARCHAR2, el tipo de datos VARCHAR está programado para redefinirse como un tipo de datos separado utilizado para cadenas de caracteres de longitud variable en comparación con una semántica de comparación diferente.