web-dev-qa-db-ja.com

PL / pgSQL関数:実行ステートメントを使用して複数の列を持つ通常のテーブルを返す方法

私はこれを持っています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ステートメントに起因すると思いますが、それ以外の方法はわかりません。

何か案は?

25
Getz

その機能をどのように実行していますか? selectステートメントとして機能します。

テーブルを作成します: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
39
bma

そのような関数を呼び出す:

select * from  my_function(123);

選択だけではありません。私がやったとそれは動作します

6
selin kamaş

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

選択の構文に応じて、関数から受け取った出力に違いがあります。

select * from myfunction();

そして

select myfunction();
2
Skysnake