Postgresql 在无法接受集合的上下文中调用的集值函数

Postgresql 在无法接受集合的上下文中调用的集值函数,postgresql,plpgsql,set-returning-functions,Postgresql,Plpgsql,Set Returning Functions,我收到错误信息: 在无法接受集合的上下文中调用的集值函数 在返回查询执行行执行此函数时: 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;

我收到错误信息:

在无法接受集合的上下文中调用的集值函数

返回查询执行
行执行此函数时:

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为什么会抱怨呢?我的错误在哪里

那么,如果我声明我的函数是一组记录,为什么Postgres会抱怨呢???我的错误在哪里

  • 在FROM子句中调用集合返回函数
  • 始终指定您的类型
  • 它被称为集合返回函数,但您希望指定复合类型

    这是完全正确的,

    RETURNS SETOF RECORD $$
    
    然而,你可能不得不用

    SELECT email, user_id
    FROM 
        app.lookup_email(4,730035455897450,6,'u')
        AS t(email text, user_id integer)
    
    不能在其中调用非类型化SRF的上下文是没有表定义的上下文。这种语法可能会变得很糟糕,因此更容易更改
    返回记录集

    RETURNS TABLE(email text, user_id integer) AS $$
    
    并使用不带列定义列表的函数

    SELECT email, user_id
    FROM app.lookup_email(4,730035455897450,6,'u')
    

    在函数中定义输出列名中查找更多信息 像下面

    CREATE OR REPLACE FUNCTION app.lookup_email(ident_id bigint,sess bigint,company_id bigint,email varchar, OUT <column_name> <data type>, OUT ...)
    
    创建或替换函数app.lookup_电子邮件(ident_id bigint、sess bigint、company_id bigint、email varchar、OUT、OUT…)
    
    我喜欢使用
    返回表(col\u 1类型,col\u 2类型)
    而不是
    转换
    返回的数据`从函数a()中选择x,y作为(x类型,y类型)。Evan解释的都是正确的,但是你仍然不应该在当前的Postgres中得到这个错误。你的说法是什么?(
    选择版本()