Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql plpgsql多行循环_Postgresql_Loops_Stored Procedures_Cursor_Plpgsql - Fatal编程技术网

Postgresql plpgsql多行循环

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

我正忙于为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       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;慢;。通过简单查询可以解决的问题应该通过简单查询解决。通常情况下,我会使用返回的变量作为表来解决,但这个示例只是一个虚拟查询,真正的查询是使用多个单独的选择和比较结果,并为循环中的返回建立数据,我不认为我能轻易地用一个选择