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)
小智 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)
| 归档时间: |
|
| 查看次数: |
54679 次 |
| 最近记录: |