2015-10-13 64 views
0

我忙着試圖爲PostgreSQL 數據庫重寫一個Informix存儲過程,而且我對所有了解PostgreSQL的人都很明顯,對於 。Postgresql plpgsql多行循環

我有我的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(); 

這只是一個虛擬的腳本,從一個虛構的用戶表中選擇,但我會怎麼使用這個腳本光標或循環,以確保所有結果返回?

+0

更好的適合在:http://dba.stackexchange.com/ –

+0

我試過數據庫管理員com但他們已經關閉了我這樣的問題,說這是不夠專業或類似的問題 – Trent

+0

stackoverflow是一個很好的地方 - plpgsql是一個開發人員主題 –

回答

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

這似乎很好地工作

+1

這個請求,你不需要'for'循環。它比'RETURN QUERY SELECT use_id,us_status,'yupy',row_number()over()FROM users;'慢。通過簡單的查詢可以解決的問題應該通過簡單的查詢來解決。 –

+0

通常情況下,我會這樣做,即返回的變量是一個表,但這個例子只是一個虛擬查詢,真正的查詢使用多個單獨的選擇並比較結果,併爲循環中的返回建立數據,I不要以爲我能用一個選擇輕鬆做到這一點 – Trent