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.

Error de PostgreSQL al crear una función con columnas variables utilizando RECORD.

Tengo esta función que debería devolver columnas variables, ¿puede ayudarme a lo que está mal con mi código?

CREATE OR REPLACE FUNCTION functions.search(column_name VARCHAR(40)) 
RETURNS SETOF RECORD AS $$
DECLARE   
    rec RECORD;
BEGIN
    RETURN QUERY EXECUTE format('SELECT %I FROM students_table');
END;
$$ LANGUAGE plpgsql;

Llamada:

SELECT * FROM functions.search(
    ('Student Id', 'Subect')
) as ("Student Id" bigint, "Subect" text)

Aquí está mi error

ERROR:  function functions.search(record) does not exist
LINE 1: SELECT * FROM functions.search(
                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Character: 15

Muchas gracias

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay un error de sintaxis en el código de la función. La declaración select está faltando una comilla de cierre después de students_table. Además, la función espera un solo argumento como VARCHAR, pero la llamada está pasando dos valores como un registro.

    Para solucionar el error, modifica el código de la función para aceptar un registro como entrada y usa el parámetro column_name para generar dinámicamente la declaración select. Aquí tienes una versión corregida de la función:

    CREATE OR REPLACE FUNCTION functions.search(cols RECORD) 
    RETURNS SETOF RECORD AS $$
    DECLARE   
        rec RECORD;
    BEGIN
        RETURN QUERY EXECUTE format('SELECT %I, %I FROM students_table', 
                                    cols."Student Id", cols."Subject");
    END;
    $$ LANGUAGE plpgsql;
    

    Y aquí está la llamada corregida a la función:

    SELECT * FROM functions.search(('Student Id', 'Subject')) AS ("Student Id" BIGINT, "Subject" TEXT);
    

    Esto debería ejecutarse correctamente y devolver las columnas deseadas.

Comments are closed.