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.

El número de columnas devueltas no coincide con la cantidad de columnas esperada // Devuelva la fila concatenada en la función plpgsql.

Estoy tratando de crear una consulta: buscando estadísticas de personas por número de teléfono.
Comencé a usar INNER JOIN en la consulta interna y ahora no entiendo qué tipo debo retornar.
Estoy intentando usar una vista como tipo, pero no pueden contener atributos con el mismo nombre. Está bien, lo reduzco a 3.
Pero aún así obtengo un error y no entiendo qué significa:

ERROR: la estructura de la consulta no coincide con el tipo de resultado de la función
DETALLE: El número de columnas devueltas (3) no coincide con el número de columnas esperadas (2).
CONTEXTO: La función PL/pgSQL get_fio_by_phone_number(bigint) línea 3 en RETURN QUERY
Estado SQL: 42804

Código:

CREAR O REEMPLAZAR VISTA persons_fios_and_telephons AS
SELECT p.name, p.surname, pt.number
FROM person p
INNER JOIN persons_telefons pt ON p.id = pt.person_id;

ELIMINAR FUNCIÓN get_fio_by_phone_number(bigint);

CREAR O REEMPLAZAR FUNCIÓN get_fio_by_phone_number(user_phone BIGINT) RETURNS SETOF persons_and_telephons
COMO $$
COMENZAR
RETURN QUERY
SELECT *
FROM persons_fios_and_telephons pat
WHERE pat.number = get_fio_by_phone_number.user_phone;

EXCEPCIÓN
CUANDO NO_DATA_FOUND ENTONCES
RAISE EXCEPTION ‘No hay ninguna persona con el número “%”.’, user_phone;
FIN;
$$ LENGUAJE plpgsql;

SELECT * FROM get_fio_by_phone_number(89998887766)

¿Hay alguna forma de hacer la función sin enumeración de atributos bruscos? ¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando crear una función que devuelva el nombre y apellido de una persona basándose en su número de teléfono. Has creado una vista llamada “persons_fios_and_telephons” que extrae esta información mediante la unión de las tablas “person” y “persons_telefons”. Luego intentas crear una función llamada “get_fio_by_phone_number” que devuelve las filas de esta vista donde el número de teléfono coincide con el parámetro de entrada.

    El mensaje de error sugiere que hay una discrepancia entre el número de columnas devueltas por la consulta y el número de columnas esperadas por la función. La función espera dos columnas (nombre y apellido) pero la vista devuelve tres columnas (nombre, apellido y número). Una posible solución es modificar la función para que solo devuelva las columnas de nombre y apellido:

    CREATE OR REPLACE FUNCTION get_fio_by_phone_number(user_phone BIGINT) RETURNS SETOF persons_fios_and_telephons
    AS $$
    BEGIN
    RETURN QUERY
    SELECT name, surname
    FROM persons_fios_and_telephons
    WHERE number = user_phone;

    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    RAISE EXCEPTION ‘No hay una persona con el número “%”.’, user_phone;
    END;
    $$ LANGUAGE plpgsql;

    Esto debería solucionar el mensaje de error y permitir que la función devuelva la salida deseada. Ten en cuenta que ahora estamos devolviendo “persons_fios_and_telephons” en lugar de usar “SETOF” directamente, que es el nombre correcto de la vista.

Comments are closed.