2015-10-29 54 views
0

我想通過遊標(plpgsql)結果循環,但不知何故在輸出控制檯上沒有打印任何東西。循環遊標結果

create or replace function curs() returns refcursor as 
$body$ 
declare 
    curs cursor for select id from stores; 
    store stores.id%TYPE; 
begin 
    open curs; 
    fetch curs into store; 
    loop 
    exit when not found; 
     raise notice 'Value: %',store; 
    end loop; 
    close curs; 
end 
$body$ language plpgsql; 

select curs(); 

如何實現一個合適的循環?

數據庫版本:9.0 表的列ID,名稱

+0

這個問題也應該提供表格定義和你的Postgres版本。 –

+0

@ErwinBrandstetter更新了問題 – Pradeep

+0

但這不是表格定義。表定義是一個完整的'CREATE TABLE'腳本,顯示數據類型和約束,或者你在psql中使用'\ d tbl'獲得的內容。 –

回答

1

首先,你的功能不回報什麼,你只是生產通知。在pgAdmin中,這些將在「消息」窗格中輸出,而不是在「數據輸出」窗格中輸出。

我假設你想要實際返回值...
但通常,你不需要明確的遊標循環。使用更方便光標FOR循環:

CREATE OR REPLACE FUNCTION test_loop() 
    RETURNS SETOF int AS 
$func$ 
DECLARE 
    _id int; -- assuming data type integer 
BEGIN 
    FOR _id IN 
     SELECT id FROM stores ORDER BY id 
    LOOP 
     RETURN NEXT _id; 
    END LOOP; 
END 
$func$ LANGUAGE plpgsql; 

注意調用語法:

SELECT * FROM test_loop(); 

通常情況下,你甚至不需要一個循環。只是簡單的SQL ...

CREATE OR REPLACE FUNCTION test_loop1() 
    RETURNS SETOF int AS 
$func$ 
BEGIN 
    RETURN QUERY 
    SELECT id FROM stores ORDER BY id; 
END 
$func$ LANGUAGE plpgsql; 

這可以簡化爲一個SQL函數:

CREATE OR REPLACE FUNCTION test_loop2() 
    RETURNS SETOF int AS 
$func$ 
    SELECT id FROM stores ORDER BY id; 
$func$ LANGUAGE sql; 

相關答案更多的細節和解釋:

+0

是的。第一個例子有效。 但是如果我不想使用循環呢? 我怎樣才能單獨讀取值並返回它們? – Pradeep