首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PL/pgSQL函数:如何使用execute语句返回包含多列的普通表

PL/pgSQL函数:如何使用execute语句返回包含多列的普通表
EN

Stack Overflow用户
提问于 2013-08-06 23:55:01
回答 3查看 80K关注 0票数 38

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

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
╔═══╦═════════════════════╗
║   ║my_function          ║
╠═══╬═════════════════════╣
║ 1 ║ (106,Ned,STARK)     ║
║ 2 ║ (130,Rob,STARK)     ║
╚═══╩═════════════════════╝

虽然我期望:

代码语言:javascript
复制
╔═══╦════════════╦════════════╦═════════════╗
║   ║ id         ║ firstname  ║ lastname    ║
╠═══╬════════════╬════════════╬═════════════╣
║ 1 ║ 106        ║ Ned        ║ STARK       ║
║ 2 ║ 103        ║ Rob        ║ STARK       ║
╚═══╩════════════╩════════════╩═════════════╝

我认为(但不确定)问题来自于EXECUTE语句,但我不知道如何做。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-07 00:25:36

你是如何执行这个函数的?它作为select语句工作。

创建表:public.users

代码语言:javascript
复制
create table public.users (id int, firstname varchar, lastname varchar);

插入一些记录:

代码语言:javascript
复制
insert into public.users values (1, 'aaa','bbb'),(2,'ccc','ddd');

功能:my_function

代码语言:javascript
复制
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;

现在可以和*一起使用了

代码语言:javascript
复制
select * from my_function(1);

查询结果

代码语言:javascript
复制
 id | firstname | lastname 
----+-----------+----------
  1 | aaa       | bbb
  2 | ccc       | ddd

或者也使用列名。

代码语言:javascript
复制
select id,firstname,lastname from my_function(1);

结果

代码语言:javascript
复制
 id | firstname | lastname 
----+-----------+----------
  1 | aaa       | bbb
  2 | ccc       | ddd
票数 54
EN

Stack Overflow用户

发布于 2017-04-20 13:49:50

像这样调用函数:

代码语言:javascript
复制
select * from  my_function(123);

不仅仅是select。我这样做了,它起作用了。

票数 11
EN

Stack Overflow用户

发布于 2018-10-02 22:25:01

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

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

代码语言:javascript
复制
select * from myfunction();

代码语言:javascript
复制
select myfunction();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18084936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档