jueves, 4 de mayo de 2023

Oracle 23c - Constructor de Tabla a partir de Valores


Otra mejora interesante en el lenguaje SQL de Oracle Database 23c es la posibilidad de "convertir" un conjunto de valores en una tabla en forma muy rápida, sin necesidad de tener que usar sentencias SELECT con la tabla DUAL.

Esta mejora al constructor VALUES (el cual solemos utilizar en las sentencias INSERT para proveer una lista de valores) ahora acepta múltiple filas en una misma sentencia, y se puede usar no solo para insertar sino en diversas sentencias SQL, como mostraremos en este artículo.


Sintaxis

La sintaxis del constructor VALUES con múltiples filas es la siguiente:

VALUES ( <ValorA1>, <ValorB1>, <ValorC1> )
     [,( <ValorA2>, <ValorB2>, <ValorC2> )...]


Uso en sentencias INSERT

Podemos usarlo en una sentencia INSERT para insertar múltiples filas en una única sentencia. Primero vamos a crear una tabla vacía para poder insertar los datos en la misma:

CREATE TABLE tValues (ID NUMBER(10) NOT NULL CONSTRAINT PK_Values PRIMARY KEY, Valor VARCHAR2(20) NOT NULL);


Luego, usaremos VALUES para insertar tres filas en la nueva tabla en una única sentencia SELECT:

INSERT INTO tValues VALUES (1, 'Valor 1'), (2, 'Valor 2'), (3, 'Valor 3');

Y vemos el resultado de la operación:


Uso en sentencias SELECT

Así como lo usamos para insertar múltiples valores en una única sentencia, podemos usar el constructor para devolver múltiple filas en una sentencia SELECT. La única diferencia es que debemos usar el mismo en la cláusula FROM dentro de paréntesis y debemos proporcionar un alias tanto para la "tabla" como para cada una de las columnas:

SELECT * FROM ( VALUES (4, 'Valor 4'), (5, 'Valor 5'), (6, 'Valor 6') ) t (ID, Valor);

Esta sentencia devuelve el siguiente resultado:


Uso en Cláusulas WITH

Este constructor puede usarse también en cláusulas WITH, como mostramos a continuación:

WITH vDatos (ID, Valor) AS ( VALUES (7, 'Valor 7'), (8, 'Valor 8'), (9, 'Valor 9') ) SELECT * FROM vDatos;

Con el siguiente resultado:


Uso en Sentencias MERGE

Otro ejemplo de usabilidad de este constructor es en sentencias MERGE. En el ejemplo, vamos a actualizar la tabla creada en el primer ejemplo, usando la siguiente sentencia: 

MERGE INTO tValues t USING (VALUES (3, 'Valor 3 Modif.'), (4, 'Valor 4 Nuevo') ) s (ID, Valor) ON (s.ID = t.ID) WHEN MATCHED THEN UPDATE SET t.Valor = s.Valor WHEN NOT MATCHED THEN INSERT (t.ID, t.Valor) VALUES (s.ID, s.Valor);

Luego de ejecutar la sentencia MERGE, si consultamos el contenido de la tabla tValues veremos que la fila #3 ha sido modificada y la fila #4 ha sido insertada:



Conclusión

El uso del constructor VALUES simplifica la generación de múltiple filas en base a valores dados, para ser utilizados en diverso tipo de sentencias SQL.


Si desean conocer más sobre Oracle 23c, es recomendable que vean estos artículos en este blog como punto de partida:

Adicionalmente, pueden consultar todos los artículos relacionados a Oracle Database 23c agrupados en en el tag Database 23c.


No hay comentarios.:

Publicar un comentario