PL/pgSQL函数:如何使用execute语句返回表

Get*_*etz 25 postgresql stored-procedures function plpgsql psql

我有这个PL/pgSQL函数,它必须返回一些用户信息.

CREATE OR REPLACE FUNCTION my_function(
        user_id integer
    ) RETURNS TABLE(
            id integer, 
            firstname character varying,
            lastname  character varying
        ) AS $$
    DECLARE
        ids character varying;
    BEGIN
        ids := '';
        --Some code which build the ids string, not interesting for this issue
        RETURN QUERY 
            EXECUTE 'SELECT 
                        users.id, 
                        users.firstname, 
                        users.lastname
                    FROM public.users 
                    WHERE ids IN (' || ids || ')';
    END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我面临的问题是函数的结果是单列表,如下所示:

???????????????????????????
?   ?my_function          ?
???????????????????????????
? 1 ? (106,Ned,STARK)     ?
? 2 ? (130,Rob,STARK)     ?
???????????????????????????
Run Code Online (Sandbox Code Playgroud)

我期待的是:

?????????????????????????????????????????????
?   ? id         ? firstname  ? lastname    ?
?????????????????????????????????????????????
? 1 ? 106        ? Ned        ? STARK       ?
? 2 ? 103        ? Rob        ? STARK       ?
?????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我认为(但不确定)问题来自EXECUTE声明,但我看不出怎么办.

有任何想法吗?

bma*_*bma 39

你是如何执行该功能的?它作为一个select语句.

创建一个表:public.users

create table public.users (id int, firstname varchar, lastname varchar);
Run Code Online (Sandbox Code Playgroud)

插入一些记录:

insert into public.users values (1, 'aaa','bbb'),(2,'ccc','ddd');
Run Code Online (Sandbox Code Playgroud)

功能:my_function

CREATE OR REPLACE FUNCTION my_function(user_id integer) RETURNS TABLE(id integer, firstname character varying, lastname character varying) AS $$
    DECLARE
        ids INTEGER[];
    BEGIN
         ids := ARRAY[1,2];
         RETURN QUERY
             SELECT users.id, users.firstname, users.lastname
             FROM public.users
             WHERE users.id = ANY(ids);
    END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

现在你可以使用*

select * from my_function(1);
Run Code Online (Sandbox Code Playgroud)

查询结果

 id | firstname | lastname 
----+-----------+----------
  1 | aaa       | bbb
  2 | ccc       | ddd
Run Code Online (Sandbox Code Playgroud)

或者也使用列名

select id,firstname,lastname from my_function(1);
Run Code Online (Sandbox Code Playgroud)

结果

 id | firstname | lastname 
----+-----------+----------
  1 | aaa       | bbb
  2 | ccc       | ddd
Run Code Online (Sandbox Code Playgroud)

  • 事实上,我用 SELECT my_function(123) 调用了我的函数。谢谢。 (2认同)
  • 有什么办法可以解决这个问题 --> 查询返回 * 而不是特定的列名/类型 (2认同)

小智 6

像这样调用函数:

select * from  my_function(123);
Run Code Online (Sandbox Code Playgroud)

不只是选择。我做到了并且有效


小智 6

http://www.postgresqltutorial.com/plpgsql-function-returns-a-table/

根据选择的语法,从函数接收到的输出有所不同:

select * from myfunction();
Run Code Online (Sandbox Code Playgroud)

select myfunction();
Run Code Online (Sandbox Code Playgroud)