私はこれを持っています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ステートメントとして機能します。
テーブルを作成します: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 * from my_function(123);
選択だけではありません。私がやったとそれは動作します
http://www.postgresqltutorial.com/plpgsql-function-returns-a-table/
選択の構文に応じて、関数から受け取った出力に違いがあります。
select * from myfunction();
そして
select myfunction();