Функция с множественным значением, вызываемая в контексте, которая не может принять набор

Я получаю сообщение об ошибке:

функция с множественным значением, вызываемая в контексте, которая не может принять набор

при выполнении этой функции в RETURN QUERY EXECUTE линия:

PLSQL $ cat lookup_email.pl 
CREATE OR REPLACE FUNCTION app.lookup_email(ident_id bigint,sess bigint,company_id bigint,email varchar)
RETURNS SETOF RECORD as $$
DECLARE
    rec RECORD;
    comp_id bigint;
    server_session bigint;
    schema_name varchar;
    query varchar;
BEGIN
    schema_name:='comp' || company_id;
    select app.session.session into server_session from app.session where app.session.identity_id=ident_id and app.session.session=sess;
    IF FOUND
    THEN
        BEGIN
            query:='SELECT i.email,u.user_id FROM app.identity as i,' || schema_name || '.uzer as u WHERE i.email like ''%' || email || '%'' and i.identity_id=u.identity_id';
            RAISE NOTICE 'executing: %',query;
            RETURN QUERY EXECUTE query;
            RETURN;
        EXCEPTION
            WHEN OTHERS THEN
                RAISE NOTICE ' query error (%)',SQLERRM;

        END;
    END IF;
END;
$$ LANGUAGE plpgsql;

Это результат psql:

dev=> select app.lookup_email(4,730035455897450,6,'u');
NOTICE:  executing: SELECT i.email,u.user_id FROM app.identity as i,comp6.uzer as u WHERE i.email like '%u%' and i.identity_id=u.identity_id
NOTICE:   query error (set-valued function called in context that cannot accept a set)
 lookup_email 
--------------
(0 rows)

Я знаю, что запрос не содержит ошибок, потому что он работает в другой сессии PSQL:

dev=> SELECT i.email,u.user_id FROM app.identity as i,comp6.uzer as u WHERE i.email like '%u%' and i.identity_id=u.identity_id;
     email      | user_id 
----------------+---------
 hola@mundo.com |       1
(1 row)

Так почему Postgres жалуется, если я объявил, что моя функция RETURNS SETOF RECORD? Где моя ошибка?

1 ответ

Решение

Итак, почему Postgres жалуется, если я объявил, что моя функция - это SET of RECORD??? Где моя ошибка?

  1. Вызовите функцию Set Returning в предложении FROM.
  2. Всегда указывайте свои типы.

Она называется Set Returning Function, но вы хотите указать составной тип

Это полностью верно,

RETURNS SETOF RECORD $$

Тем не менее, вам, возможно, придется позвонить с

SELECT app.lookup_email(4,730035455897450,6,'u')
AS t(col1 type, col2 type)

Контекст, в котором вы не можете назвать нетипизированный SRF, - это контекст, в котором нет определения таблицы. Этот синтаксис может gett может стать неприятным, так что просто легче изменить RETURNS SETOF RECORD в

RETURNS TABLE(col1 type, col2 type) AS $$

Поскольку каждая таблица имеет свой тип под тем же именем, вы также можете сделать

RETURNS SETOF myTable AS $$

Найти больше информации в документах

Определить имя выходного столбца в функции, как показано ниже

CREATE OR REPLACE FUNCTION app.lookup_email(ident_id bigint,sess bigint,company_id bigint,email varchar, OUT <column_name> <data type>, OUT ...)
Другие вопросы по тегам