Postgresql plpgsql多行循环
我正忙于为PostgreSQL重写Informix存储过程 数据库,我被一些对我来说可能很明显的事情缠住了 每个了解PostgreSQL的人 我的sql脚本如下Postgresql plpgsql多行循环,postgresql,loops,stored-procedures,cursor,plpgsql,Postgresql,Loops,Stored Procedures,Cursor,Plpgsql,我正忙于为PostgreSQL重写Informix存储过程 数据库,我被一些对我来说可能很明显的事情缠住了 每个了解PostgreSQL的人 我的sql脚本如下 -- ensure type and function get created drop type if exists tp_users cascade; drop function if exists sp_cmplist(); -- create type create type tp_users as ( us_id
-- ensure type and function get created
drop type if exists tp_users cascade;
drop function if exists sp_cmplist();
-- create type
create type tp_users as (
us_id char(30),
us_status char(1)
);
create function sp_cmplist()
returns tp_users as $$
declare
lr_users tp_users;
begin
for lr_users in
select users.us_id, users.us_status
from users
loop
return lr_users;
end loop;
end
$$ language 'plpgsql';
select sp_cmplist();
这只是一个从虚拟用户表中选择的虚拟脚本,但如何将此脚本与游标或循环一起使用以确保返回所有结果?此代码工作:
CREATE TABLE foo(a int);
INSERT INTO foo VALUES(10),(20);
CREATE OR REPLACE FUNCTION retfoo()
RETURNS SETOF foo AS $$
BEGIN
RETURN QUERY SELECT * FROM foo;
RETURN;
END;
$$ LANGUAGE plpgsql;
postgres=# SELECT * FROM retfoo();
┌────┐
│ a │
├────┤
│ 10 │
│ 20 │
└────┘
(2 rows)
时间:1.143毫秒我可能已经用以下回答了我自己的问题
drop type if exists tp_users cascade;
drop function if exists sp_cmplist();
create type tp_users as (
us_id text,
us_status text,
lv_nothing text,
lv_cnt int
);
create function sp_cmplist()
returns setof tp_users as $$
declare
lr_users tp_users;
lv_cnt int;
begin
lv_cnt := 0;
for lr_users in
select users.us_id, users.us_status
from users
loop
-- increment this counter for testing purposes
lv_cnt := lv_cnt + 1;
lr_users.lv_nothing := 'yupy';
lr_users.lv_cnt := lv_cnt;
return next lr_users;
end loop;
return;
end
$$ language 'plpgsql';
select * from sp_cmplist();
这似乎非常适合于:我以前尝试过数据库管理员社区,但他们以这样的问题将我关闭,说它不够专业,或者说stackoverflow是个好地方-plpgsql是一个开发人员主题,您不需要周期。它比返回查询SELECT use_id,us_status,'yupy',row_number over FROM users;慢;。通过简单查询可以解决的问题应该通过简单查询解决。通常情况下,我会使用返回的变量作为表来解决,但这个示例只是一个虚拟查询,真正的查询是使用多个单独的选择和比较结果,并为循环中的返回建立数据,我不认为我能轻易地用一个选择