es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo utilizar un tipo compuesto anidado con otro tipo compuesto en PostgreSQL

Buenas tardes a todos, estaba intentando hacer que un procedimiento funcionara con los tipos que creé para limpiar un poco el código Java que hice para realizar alguna persistencia de datos, pero durante la creación de la función en PostgreSQL, tuve una duda sobre cómo proceder, ¿cómo sería la llamada a este procedimiento en este caso?

CREATE TYPE store AS (
    id INTEGER,
    name VARCHAR(255),
    document VARCHAR(255)
);

CREATE TYPE inventory AS (
    id INTEGER,
    product_id INTEGER,
    store_id INTEGER,
    amount INTEGER,
    price NUMERIC(15,2)
);

CREATE TYPE product AS (
    id INTEGER,
    name VARCHAR(255),
    product_inventory inventory
);

CREATE OR REPLACE FUNCTION products_test(my_store IN store, my_products IN product[])
RETURNS product[] AS $$
BEGIN
    RETURN my_products;
END;
$$ LANGUAGE plpgsql;

SELECT products_test(ARRAY[
    '(1,"tv", INVENTORIES(1, 1, 1, 20, 20.00))',
    '(2,"PC", INVENTORIES(1, 1, 1, 20, 20.00))'
]::products[]);

Cuando intento llamar a esta función con la cláusula select de arriba, obtengo el siguiente error:

ERROR:  registro literal mal formado: " INVENTORIES(1"
LINE 2:  '(1,"tv", INVENTORIES(1, 1, 1, 20, 20.00))',
         ^
DETAIL:  Falta un paréntesis izquierdo.
SQL state: 22P02
Character: 16

¿A qué error podría estar relacionado esto? ¿Y cuál es la forma correcta de llamar a estos tipos compuestos anidados?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error está relacionado con la sintaxis del literal de registro en la llamada de la función. En lugar de usar la palabra clave “INVENTORIES”, debería usar el nombre del tipo compuesto “inventario”. La forma correcta de llamar a los tipos compuestos anidados sería:

    SELECT products_test(
        (1, 'nombre_tienda', 'documento_tienda')::tienda,
        ARRAY[
            (1, 'tv', (1, 1, 1, 20, 20.00)::inventario),
            (2, 'PC', (1, 1, 1, 20, 20.00)::inventario)
        ]::producto[]
    );
    

    En este ejemplo, hemos utilizado una conversión explícita para convertir las tuplas en tipos compuestos. También hemos utilizado comillas simples en lugar de comillas dobles para evitar escapar las comillas dobles dentro de los valores de cadena.

Comments are closed.