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 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í?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema con el código proporcionado es el uso de la sentencia RETURN SELECT dentro del bloque LOOP. Esto no es sintácticamente correcto, ya que la sentencia RETURN debería usarse para salir de la función y retornar un valor. Para imprimir las abreviaturas de los estados, puedes utilizar la sentencia RAISE NOTICE dentro del bucle.

    Aquí está el código corregido:

    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
            RAISE NOTICE '%', state;
        END LOOP;
        RETURN 'Hecho';
    END;
    $$ LANGUAGE plpgsql;
    
    SELECT my_schema.showState();
    

    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 sentencia RAISE NOTICE. RAISE NOTICE imprimirá cada abreviatura de estado como un mensaje, que podemos ver en el resultado de la consulta.

    ¡Espero que esto ayude!

Comments are closed.