1、下面的代碼會建立一個top100cur()函數,該函數返回一個匿名遊標
--drop function top100cur();create function top100cur() returns refcursor as $$declare abc refcursor;beginopen abc for select * from person limit 100;return abc;end$$language plpgsql;SELECT top100cur();--返回匿名遊標--fetch all from abc;--匿名遊標,所以此行錯誤
2、下面的代碼會建立的函數會返回一個名字為abc的遊標(能發現差別吧?是的,是否匿名,取決於open遊標時,該遊標變數是否已經綁定)
--drop function top100cur();create function top100cur() returns refcursor as $$declare abc cursor for select * from person limit 100;beginopen abc;return abc;end$$language plpgsql;SELECT top100cur();--返回名字為abc的遊標fetch all from abc;--此行正確,執行時,記得把此行與select行以前拖黑,然後F5
3、返回由調用者命名的遊標
--drop function top100cur(refcursor);create function top100cur(refcursor) returns refcursor as $$beginopen $1 for select * from person limit 100;return $1;end$$language plpgsql;SELECT top100cur('abc');fetch all from abc;
4、返回一個名字叫$1的遊標
--drop function top100cur(refcursor);create function top100cur(refcursor) returns refcursor as $$declare $1 cursor for select * from person limit 100;beginopen $1;--不open的話,返回的名字為"$1"遊標不能使用!return $1;end$$language plpgsql;SELECT top100cur('abc');fetch all from "$1";
5、返回一個匿名的遊標
--drop function top100cur(refcursor);create function top100cur(refcursor) returns refcursor as $$declare $1 refcursor;beginopen $1 for select * from person limit 100;return $1;end$$language plpgsql;SELECT top100cur('abc');--fetch all from "$1";--匿名遊標,所以此行錯誤
6、返回由調用者指定的遊標(知道跟4和5的不同吧?4、5中,declare聲明的遊標變數名稱太特殊了,把匿名參數的名字隱藏了……)
--drop function top100cur(refcursor);create function top100cur(refcursor) returns refcursor as $$declare abcdef refcursor;beginopen $1 for select * from person limit 100;return $1;end$$language plpgsql;SELECT top100cur('abc');fetch all from "abc";
7、直接open一個沒有被declare,也沒有被傳入的遊標變數
--drop function top100cur(refcursor);create function top100cur(refcursor) returns refcursor as $$declare abcdef refcursor;begin--open defg for select * from person limit 100;--錯誤: "defg" 不是一個已知變數--return defg;-----------LINE 5: open defg for select * from person limit 100;end$$language plpgsql;
總結:
1、declare的變數,會導致函數參數被隱藏(如,declare $1後,則第一個匿名參數就被隱藏了);
2、declare只是聲明一個遊標,不會open遊標,而沒有open的遊標是不能用的哦~
3、declare之後再open遊標時,如果這個遊標是個未綁定的(declare時沒有cursor for XXX),那麼open後得到的是一個匿名遊標;
4、open操作的遊標變數,要麼是declare的,要麼是當做參數傳入的字串;除此之外,報錯!
關於PostgreSQL中對遊標的描述,請參見:
《PostgreSQL 8.1 中文文檔(PostgreSQL 中國 製作)》的36.8章