Use el generador de código de jOOQ para pasar fácilmente los parámetros de la tabla

Use el generador de código de jOOQ para pasar fácilmente los parámetros de la tabla

Microsoft T-SQL admite una función de lenguaje denominada parámetro de valor de tabla (TVP), que es un parámetro de un tipo de tabla que se puede pasar a una función o procedimiento almacenado.

Por ejemplo, puedes escribir:

CREATE TYPE u_number_table AS TABLE (column_value INTEGER);

CREATE FUNCTION f_cross_multiply (
  @numbers u_number_table READONLY
)
RETURNS @result TABLE (
  i1 INTEGER,
  i2 INTEGER,
  product INTEGER
)
AS
BEGIN
  INSERT INTO @result
  SELECT
    n1.column_value, 
    n2.column_value, 
    n1.column_value * n2.column_value
  FROM @numbers n1
  CROSS JOIN @numbers n2

  RETURN
END

Esta función toma un parámetro de tabla (TVP) y produce un conjunto de resultados que contiene el producto cruzado de la tabla de parámetros consigo misma. La función pasa a ser una función de tabla, pero no es estrictamente necesaria. Los parámetros de la tabla se pueden pasar a cualquier función o procedimiento.

En T-SQL nativo, la función anterior se puede usar de la siguiente manera:

DECLARE @t u_number_table;
INSERT INTO @t VALUES (1), (2), (3);
SELECT * FROM f_cross_multiply(@t);

Produce la siguiente salida:

|i1 |i2 |product|
|---|---|-------|
|1  |1  |1      |
|2  |1  |2      |
|3  |1  |3      |
|1  |2  |2      |
|2  |2  |4      |
|3  |2  |6      |
|1  |3  |3      |
|2  |3  |6      |
|3  |3  |9      |
Índice
  1. Llamar a la función desde Java
    1. Así:

Llamar a la función desde Java

Usando JDBC nativo, es posible seguir los tutoriales de parámetros de la tabla y usar un com.microsoft.sqlserver.jdbc.SQLServerDataTablepero si usa jOOQ y su generador de código, el tipo y la función definidos por el usuario habrán generado código Java al que puede llamar fácilmente:

List<Integer> l = List.of(1, 2, 3);
Result<FCrossMultiplyRecord> result = ctx
    .selectFrom(fCrossMultiply(new UNumberTableRecord(
        l.stream().map(UNumberTableElementTypeRecord::new).toList()
    )))
    .fetch();

Puede imaginar consultas más complejas donde se usa la función de tabla, por ejemplo en un CROSS APPLY operador.

Hay varios objetos generados aquí:

  • FCrossMultiplyRecord es un TableRecord que contiene las líneas producidas por el f_cross_multiply función.
  • Routines.fCrossMultiply es un método estático importado que modela una llamada incrustada a una función de tabla (también son posibles llamadas independientes)
  • UNumberTableRecord es un registro que representa el tipo definido por el usuario u_number_tableque se puede pasar como un parámetro de tabla
  • UNumberTableElementTypeRecord es un tipo de registro sintético para una sola línea de un u_number_table (¡También son posibles tipos más complejos con múltiples atributos!)

Imprimir este resultado da:

+----+----+-------+
|  i1|  i2|product|
+----+----+-------+
|   1|   1|      1|
|   2|   1|      2|
|   3|   1|      3|
|   1|   2|      2|
|   2|   2|      4|
|   3|   2|      6|
|   1|   3|      3|
|   2|   3|      6|
|   3|   3|      9|
+----+----+-------+

De lo contrario, simplemente use el código generado para acceder a las filas de resultados de esta manera:

result.forEach(r -> {
    System.out.println(
        r.getI1() + " * " + r.getI2() + " = " + r.getProduct()
    );
});

Obtener:

1 * 1 = 1
2 * 1 = 2
3 * 1 = 3
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
1 * 3 = 3
2 * 3 = 6
3 * 3 = 9

¡Simplemente conecte el generador de código de jOOQ a su base de datos de SQL Server y comience a llamar a sus funciones aceptando fácilmente los parámetros de la tabla!

Si quieres conocer otros artículos parecidos a Use el generador de código de jOOQ para pasar fácilmente los parámetros de la tabla puedes visitar la categoría Código.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Esta página web utiliza cookies para analizar de forma anónima y estadística el uso que haces de la web, mejorar los contenidos y tu experiencia de navegación. Para más información accede a la Política de Cookies . Ver mas