2016-12-15 38 views
1

我想問如何返回光標到有限的表? 我的意思是一個函數,它需要(如果絕對位置,如果向前或向後,多少條記錄,絕對位置),並作爲獲取絕對+向前。 我試過這個,但沒有工作。函數返回有限的光標

drop function func(text,text,integer,integer); 
create function func(text,text,integer,integer=0) returns refcursor as ' 
declare 
    ref refcursor; 
begin 
    open ref for select * from test; 
    if $1="A" then 
     if $2="F" then 
      move absolute $4 in ref; 
      return fetch forward $3 from ref; 
     elseif $2="B" 
      move absolute $4 in ref; 
      return fetch backward $3 from ref; 
     end if; 
    elseif $1="B" then 
     if $2="F" then 
      return fetch forward $3 from ref; 
     elseif $2="B" 
      return fetch backward $3 from ref; 
     end if; 
    end if; 
end; 
'language plpgsql; 

回答

0

而不是試圖操縱遊標,我想你可能需要在查詢本身中應用這些約束。

我假設你真正的查詢將有一個ORDER BY條款,因爲沒有它的FETCH方向是相當沒有意義的。此外,「絕對」參數似乎沒有多大用處,因爲指定'B'與指定'A'的位置0相同,因此您應該可以將其刪除。

最終的結果會是這樣的:

create or replace function func(dir text, num integer, pos integer=0) returns refcursor as $$ 
declare 
    ref refcursor; 
begin 
    open ref for execute 
    ' select * from test ' 
    ' order by x ' || case dir when 'F' then 'ASC' when 'B' then 'DESC' end || 
    ' limit ' || num || 
    ' offset ' || pos; 
    return ref; 
end; 
$$ language plpgsql;