【问题标题】:PL/pgSQL functions: How to return a normal table with multiple columns using an execute statementPL/pgSQL 函数:如何使用执行语句返回具有多列的普通表
【发布时间】:2013-08-07 17:46:21
【问题描述】:

我有这个 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;

我面临的问题是函数的结果是这样的单列表:

╔═══╦═════════════════════╗
║   ║my_function          ║
╠═══╬═════════════════════╣
║ 1 ║ (106,Ned,STARK)     ║
║ 2 ║ (130,Rob,STARK)     ║
╚═══╩═════════════════════╝

正如我所料:

╔═══╦════════════╦════════════╦═════════════╗
║   ║ id         ║ firstname  ║ lastname    ║
╠═══╬════════════╬════════════╬═════════════╣
║ 1 ║ 106        ║ Ned        ║ STARK       ║
║ 2 ║ 103        ║ Rob        ║ STARK       ║
╚═══╩════════════╩════════════╩═════════════╝

我认为(但不确定)问题来自EXECUTE 语句,但我不知道该怎么做。

有什么想法吗?

【问题讨论】:

  • 你是用SELECT my_function(123);还是SELECT FROM my_function(123);调用函数?
  • 你说得对,我用 SELECT my_function(123); 执行了这个函数它与 FROM 完美配合...谢谢!
  • 你是怎么把那些桌子放在那里的?

标签: postgresql function stored-procedures plpgsql psql


【解决方案1】:

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

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

select * from myfunction();

select myfunction();

【讨论】:

    【解决方案2】:

    您是如何执行该功能的?它作为一个选择语句工作。

    创建表:public.users

    create table public.users (id int, firstname varchar, lastname varchar);
    

    插入一些记录:

    insert into public.users values (1, 'aaa','bbb'),(2,'ccc','ddd');
    

    函数: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;
    

    现在你可以使用 *

    select * from my_function(1);
    

    查询结果

     id | firstname | lastname 
    ----+-----------+----------
      1 | aaa       | bbb
      2 | ccc       | ddd
    

    或者也可以使用列名

    select id,firstname,lastname from my_function(1);
    

    结果

     id | firstname | lastname 
    ----+-----------+----------
      1 | aaa       | bbb
      2 | ccc       | ddd
    

    【讨论】:

    • 确实,我用 SELECT my_function(123) 调用了我的函数。谢谢。
    • 有什么办法可以解决这个问题 --> 查询返回 * 而不是特定的列名/类型
    【解决方案3】:

    这样调用函数:

    select * from  my_function(123);
    

    不仅仅是选择。我做到了,它有效

    【讨论】:

      猜你喜欢
      • 2013-06-19
      • 2014-07-18
      • 2012-08-05
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      相关资源
      最近更新 更多