
Un valor nulo es un valor especial devuelto por una base de datos para indicar un valor o resultado indefinido. No hay valores nulos especiales en ABAP, y no es fácil agregar una función de este tipo al lenguaje en estos días. El rango de valores de un tipo de datos ocupa todo el espacio de memoria de su objeto de datos. Imagine, por ejemplo, el tipo entero simple de un byte INT1
del Diccionario ABAP, correspondiente a b
en ABAP: el rango de valores es de 0 a 255, que es exactamente el rango que puede expresar con bits de 1
byte (hexadecimal 00
a FF
). No queda espacio para un valor nulo y no queda ningún valor para representar un valor nulo.
Cuando se lee un valor nulo con ABAP SQL de la base de datos, simplemente se convierte al valor inicial específico del tipo del campo de destino ABAP, que es 0
para tipos numéricos y en blanco para tipos de caracteres. Por lo tanto, no hay forma de saber si se leyó un valor nulo mediante una simple comparación. Durante mucho tiempo, la única forma de manejar valores nulos era la expresión relacional IS NULL
y, más recientemente, indicadores nulos.
De hecho, en los primeros días de ABAP, esto nunca se vio como un problema porque en el mundo ABAP, los valores nulos solo aparecían en la base de datos en casos excepcionales:
En términos de accesos de lectura, fue solo con la introducción de combinaciones externas en ABAP Release 4.0 que los valores nulos comenzaron a aparecer en los conjuntos de resultados. A partir de ese momento, a medida que se añadían más y más expresiones y funciones SQL, aparecían valores nulos como resultado de estas expresiones y funciones. Un ejemplo destacado son las distinciones de casos: si omite el ELSE
declaración, la expresión producirá automáticamente el valor nulo como resultado. Otros ejemplos son funciones que devuelven valores nulos cuando ocurre una excepción. Por estas razones, los valores nulos se están volviendo más comunes en ABAP SQL y existe la necesidad de mejorar el manejo de los valores nulos.
Además de la expresión relacional IS NULL
y los indicadores nulos mencionados anteriormente, existe una nueva forma de expresar explícitamente un valor nulo en ABAP SQL, a saber, la expresión NULL
.
Mientras que ABAP CDS introdujo ELSE NULL
con ABAP Release 7.89, SAP BTP ABAP Environment 2208 (ver matriz de funciones de todas las funciones de CDS DDL), que le permite especificar un valor nulo después de ELSE
de un CASE
expresión, ABAP SQL va un paso más allá al introducir una nueva expresión SQL NULL
que se puede utilizar en muchas más posiciones de operandos de ABAP SQL. La expresión SQL especial NULL
está disponible desde ABAP Release 7.83, SAP BTP ABAP Environment 2102.
Este blog ofrece una breve introducción a la expresión nula, y dado que NULL
se puede utilizar casi en cualquier parte del entorno ABAP SQL, hemos probado todas las posiciones y resumido nuestros hallazgos y posibles dificultades.
el operando NULL
representa el valor nulo y se puede utilizar en muchas posiciones de operandos de expresiones SQL. Un ejemplo famoso es el distinción de casos introducido arriba.
Tenga en cuenta que ABAP no tiene valores nulos. Más bien, los valores nulos que se asignan a un objeto de datos ABAP en ABAP SQL, Native SQL o AMDP se convierten en valores iniciales dependientes del tipo. Leer más aquí. |
Así, la expresión NULL
es una opción para manejar valores nulos en ABAP SQL. Otras opciones son la expresión relacional IS NULL
e indicadores nulos. La diferencia entre NULL
y IS NULL
se explica a continuación. Un aspecto importante del uso NULL
es que debe ser posible derivar un tipo (ver Trampas).
Introduciendo NULL
el objetivo era permitir NULL
como un valor de columna constante en la lista de campos. Al final, NULL
generalmente se permitía en ABAP SQL. Esto hace posible establecer una expresión completa en nulo usando específicamente NULL
para uno de sus operandos dependiendo de la condición. Los posibles casos de uso se explican a continuación.
Dos posibles casos de uso de la expresión nula son ELSE NULL
y THEN NULL
, los cuales son parte de las distinciones de casos. Otro ejemplo de distinciones de casos se da en el Alcance sección para demostrar las posiciones de operandos en las que NULL
puede ser usado. El siguiente código de muestra muestra un ejemplo de todos los vuelos en marzo de 2023 con el código de la aerolínea LH
. Se incluye una distinción de casos para identificar vuelos con asientos de primera clase disponibles.
METHOD main.
SELECT FROM sflight
FIELDS carrid,
connid,
fldate,
price,
currency,
planetype,
CASE
WHEN seatsocc_f < seatsmax_f THEN 'yes'
WHEN seatsocc_f = seatsmax_f THEN CAST( NULL AS CHAR( 1 ) )
END AS book_a_seat
WHERE fldate BETWEEN datn`20230301` AND datn`20230331`
AND carrid = 'LH'
INTO TABLE @FINAL(result) INDICATORS NULL STRUCTURE null_ind.
cl_demo_output=>display( result ).
ENDMETHOD.
(Por cierto, ¿reconoce los literales escritos en el ejemplo? Mire esto entrada en el blog.)
La consulta devuelve lo siguiente (excluyendo NULL_IND
):
CARRIDO | CONNIDO | FLDATE | PRECIO | DIVISA | TIPO DE PLANE | RESERVAR UN ASIENTO |
LH | 0401 | 2023-03-14 | 668.2 | EUR | 767-200 | |
LH | 0402 | 2023-03-10 | 668.2 | EUR | A380-800 | Sí |
LH | 2402 | 2023-03-15 | 244.2 | EUR | A380-800 | Sí |
LH | 2407 | 2023-03-15 | 244.2 | EUR | A320-200 | |
LH | 0400 | 2023-03-15 | 808.52 | EUR | A340-600 |
El caso de uso de NULL
aquí es que usted está principalmente interesado en los asientos disponibles, pero aún le gustaría saber acerca de otros vuelos, tal vez para planificar un vuelo en los próximos meses. Todo acerca de NULL
y el indicador nulo se explica a continuación.
El siguiente ejemplo muestra dónde NULL
se puede utilizar en una distinción de caso simple. Puedes encontrar un ejemplo como este en el Documentación de palabras clave ABAP.
METHOD main.
SELECT FROM scarr
LEFT OUTER JOIN spfli
ON scarr~carrid = spfli~carrid
FIELDS scarr~carrid,
distid,
CASE distid
WHEN 'MI' THEN 'Miles'
WHEN 'KM' THEN 'Kilometers'
ELSE NULL
END AS distance,
CASE distid
WHEN 'MI' THEN NULL
WHEN NULL THEN 'Kilometers'
ELSE NULL
END AS null
INTO TABLE @FINAL(result)
UP TO 5 ROWS.
cl_demo_output=>display( result ).
ENDMETHOD.
En este ejemplo, se especifican dos distinciones de casos simples que contienen NULL
. NULL
se puede usar explícitamente en la posición del operando después ELSE
pero también después WHEN
y THEN
. El result
la tabla se ve así:
CARRIDO | DISTID | DISTANCIA | NULO |
Automóvil club británico | MI | Millas | |
Automóvil club británico | MI | Millas | |
C.A. | |||
FA | |||
Arizona | MI | Millas |
Al mirar el result
tabla, no puede ver si los valores nulos están presentes o no. Esto se debe a que los valores nulos se convierten en valores iniciales y se representan con espacios en blanco, por ejemplo. Los indicadores nulos se pueden utilizar para identificar valores nulos:
INTO TABLE @FINAL(result) INDICATORS NULL STRUCTURE null_ind
Usando indicadores nulos, se pueden determinar las columnas del conjunto de resultados que contienen el valor nulo. En este ejemplo, se utiliza un indicador estructurado y cada componente de la estructura es del tipo x
con longitud 1
. Un valor componente de hexadecimal 1
denota un valor nulo en la columna respectiva del conjunto de resultados. El result
La tabla ahora se ve así:
Tabla de resultados con un indicador nulo
El result
tabla enfatiza que las columnas DISTID
, DISTANCE
y NULL
devuelve el valor nulo para todas las comparaciones que no son verdaderas. Además, la columna NULL
devuelve un resultado desconocido para las comparaciones con el valor nulo. Mientras NULL
se pasa a la tabla de resultados, los valores nulos se convierten en valores iniciales.
Básicamente, NULL
se puede utilizar en cualquier posición de operando de una expresión SQL. La siguiente tabla marca excepciones. La columna Verdadero Falso indica si NULL
puede ser usado (Verdadero) o si NULL
No puede ser usado (FALSO) en una posición de operando específica.
La mayoría de las excepciones positivas ocurren para funciones de cadena como tipo de argumento válido para pcre
, sub
y case
. Las funciones de ventana se mencionan aquí porque antes solo se permitían columnas como argumento NULL
Fue presentado.
Como se mencionó anteriormente, las dos conclusiones más importantes para usar NULL
deben recordar que debe ser posible derivar un tipo y que la expresión nula se puede especificar en casi todas las posiciones de expresión SQL con algunas excepciones. Si NULL
se usa en una expresión relacional, el resultado nunca es verdadero sino desconocido. Unknown es similar a false pero el comportamiento es diferente para AND
, OR
y NOT
. Además, otro posible escollo sale a la luz al probar el manejo de errores con, por ejemplo, el UNIT_CONVERSION()
función.
Código | tipo de error | Mensaje de error |
|
Estático | No es posible derivar un tipo para el valor NULL de su contexto. |
|
Dinámica | Se genera una excepción capturable de la clase CX_SY_OPEN_SQL_DB. |
Según el primer ejemplo, puede suponer que necesita especificar una longitud para los tipos que no tienen una longitud fija. Por ejemplo, escribir CAST( NULL AS CHAR( 10 ) )
. Esto es cierto y debe especificar la longitud para todos los tipos con una longitud variable para moldes con NULL
. El segundo ejemplo muestra el manejo dinámico de errores de NULL
. Además, como se introdujo anteriormente, la expresión NULL
se parece a la expresión relacional IS NULL
. Es importante señalar que mientras NULL
es una expresion, IS NULL
es una expresión relacional con sintaxis de predicado.
La expresión SQL NULL
maneja valores nulos y se puede especificar en la mayoría de las posiciones de operandos en una expresión SQL. NULL
depende del tipo y necesita una longitud específica para tipos con longitudes variables en una expresión de conversión. No confunda la expresión relacional con la sintaxis del predicado IS NULL
con la expresión NULL
. Teniendo todo en cuenta, puede comenzar a usar NULL
. Algunas referencias adicionales se enumeran a continuación:
Ahora debería saber cómo usar la expresión SQL NULL
en tus proyectos. Usar NULL
para el manejo de nulos en ABAP SQL. Los ejemplos proporcionados en este blog están destinados únicamente a fines de demostración. ¿Estás emocionado de usar la expresión nula especial? Escribe tus pensamientos en la sección de comentarios. No te pierdas los nuevos elementos lingüísticos y sigue mi perfil (lena padeken) para publicaciones de blog similares.
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073