2009-09-30 36 views
1

我有一個函數寫在PL/pgSQL裏,如下所述的其中一個以相同的方式工作:REFCURSOR PL/pgSQL的

CREATE FUNCTION reffunc(text) RETURNS refcursor AS ' 
BEGIN 
    OPEN $1 FOR SELECT col FROM test WHERE c1=$1; 
    RETURN $1; 
END; 
' LANGUAGE plpgsql; 

我希望能夠用一個單一的選擇命令使用反對它(使用事務)所記錄的方法是:

BEGIN; 
SELECT reffunc('funccursor'); 
FETCH ALL IN "<unnamed cursor 1>"; 
COMMIT; 

我相信我已經能夠之前做到這一點,但是我怎麼也想不起我都做到了,或者發現它記錄。這可能嗎?或者是否有可能以不使用refcursor的方式輸出該函數。

我期待多行返回和一些數據檢查是在函數返回之前完成的。因此需要使用存儲過程。

回答

3

確定無需光標即可返回。

例子:

CREATE FUNCTION reffunc(in_c1 text) RETURNS setof test AS ' 
DECLARE 
    temprec test; 
BEGIN 
    FOR temprec in SELECT col FROM test WHERE c1 = in_c1 LOOP 
     return next temprec; 
    END LOOP; 
    RETURN; 
END; 
' LANGUAGE plpgsql; 
select * from reffunc('funccursor'); 

如果你使用8.4,你也可以用「返回查詢」,這是更漂亮。

1
create or replace function reffunc(in_c1 text) 
returns setof refcursor as 
$body$ 
declare 
     temprec refcursor; 
/* 
    MODULE NAME   DEVELOPER NAME  CREATED DATE MODIFIED DATE 
         MOHAMMED SHAKIR  9-6-2011 
*/ 
Begin 
    open temprec for 
      select col from test where c1 = in_c1; 
RETURN NEXT REF1; 
end; 
$body$ 

LANGUAGE 'plpgsql' VOLATILE