2016-12-15 9 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

カーソルを操作しようとするのではなく、おそらくクエリ自体にこれらの制約を適用する必要があると思います。

FETCHの方向性が無意味なので、実際のクエリにはORDER BY句があると仮定しています。また、'B'を指定することは、位置の'A'を指定するのと同じであるため、「絶対」パラメータはあまり目的を果たさないように見えるので、削除する必要があります。

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; 

最終結果はこのようなものになるだろう