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?
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:
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.