Cómo usar FOREACH en un bucle de PostgreSQL
Estoy tratando de escribir una instrucción muy simple de pgsql para iterar a través de un array simple de abreviaturas de estados.
CREATE OR REPLACE FUNCTION my_schema.showState()
RETURNS text AS
$$
DECLARE
my_array text[] := '["az","al", "ak", "ar"]' ;
state text;
BEGIN
FOREACH state IN ARRAY my_array
LOOP
RETURN QUERY SELECT format('%s', state);
END LOOP;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM showState();
Estoy utilizando PostgresSQL versión 11+. Sigo obteniendo un error ERROR: syntax error at or near "BEGIN"
. Por ahora, quiero ver solo la abreviatura del estado impresa en la ventana de resultados. Algo así como esto:
Captura de pantalla del resultado
¿Qué estoy haciendo mal aquí?
davy.ai
Solución
El problema con el código proporcionado es el uso de la sentencia
RETURN SELECT
dentro del bloqueLOOP
. Esto no es sintácticamente correcto, ya que la sentenciaRETURN
debería usarse para salir de la función y retornar un valor. Para imprimir las abreviaturas de los estados, puedes utilizar la sentenciaRAISE NOTICE
dentro del bucle.Aquí está el código corregido:
Cambios realizados:
– Se reemplazaron las comillas simples alrededor del array por comillas dobles para obtener un array real.
– Se definió una variable ‘state’ de tipo ‘texto’ para almacenar la abreviatura del estado actual dentro del bucle.
– Se cambió la sintaxis de
FOREACH
a “FOREACH … IN ARRAY …” que es la forma correcta de recorrer un array en PostgresSQL.– Se reemplazó
RETURN SELECT format(...)
por una sentenciaRAISE NOTICE
.RAISE NOTICE
imprimirá cada abreviatura de estado como un mensaje, que podemos ver en el resultado de la consulta.¡Espero que esto ayude!