首页 文章

Postgresql plpgsql多行循环

提问于
浏览
0

我正忙着为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();

这只是一个虚拟脚本,可以从虚构的用户表中进行选择,但是如何将这个脚本与游标或循环一起使用以确保返回所有结果?

2 回答

  • 0

    此代码有效:

    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毫秒

  • 0

    我可能已经用以下方式回答了我自己的问题

    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();
    

    这似乎完美无缺

相关问题