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 puedo insertar una fila y devolver * con plpgsql?

Esta es la primera vez que trabajo con plpgsql y tengo lo siguiente:

create or replace function create_marker(title text, description text, latitude decimal, longitude decimal) 
returns record
language plpgsql
as $$
declare 
  res record;
begin
  INSERT INTO markers (
    title,
    description,
    latitude,
    longitude,
    geometry
  ) VALUES 
  ('marker 1', 'this is marker1 1 description', 10, -100, ST_SetSRID(ST_MakePoint(10, -100), 4326))
  RETURNING * into res;
end;
$$;

pero obtengo un error:

se requiere una lista de definición de columnas para las funciones que devuelven "registro"

¿Cómo puedo solucionar esto?

Quiero poder hacer algo como esto:

SELECT * FROM create_marker(...)
Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que se requiere una lista de definición de columnas para las funciones que devuelven “record”. Para solucionar esto, puedes definir explícitamente las columnas en la declaración CREATE FUNCTION de la siguiente manera:

    CREATE OR REPLACE FUNCTION create_marker(
        title text,
        description text,
        latitude decimal,
        longitude decimal
    ) RETURNS TABLE (
        title text,
        description text,
        latitude decimal,
        longitude decimal,
        geometry geometry(Point,4326)
    ) AS $$
    BEGIN
        RETURN QUERY INSERT INTO markers (
            title,
            description,
            latitude,
            longitude,
            geometry
        ) VALUES (
            title,
            description,
            latitude,
            longitude,
            ST_SetSRID(ST_MakePoint(latitude, longitude), 4326)
        ) RETURNING *;
    END;
    $$ LANGUAGE plpgsql;
    

    Ten en cuenta que hemos agregado una declaración RETURNS TABLE que indica las definiciones de las columnas que se devolverán en nuestra función. También hemos utilizado la declaración RETURN QUERY para ejecutar nuestra declaración INSERT y RETURNING * para devolver la fila insertada.

    Una vez que hayas definido la función, puedes llamarla de la siguiente manera:

    SELECT * FROM create_marker('marker 1', 'esta es la descripción del marcador 1', 10, -100);
    

    Esto debería insertar una fila en la tabla markers y devolver la fila insertada.

Comments are closed.