1、下面的代碼會建立一個top100cur()函數,該函數返回一個匿名遊標
- --drop function top100cur();
-
- create function top100cur() returns refcursor as $$
- declare
- abc refcursor;
- begin
- open 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;
- begin
- open 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 $$
- begin
- open $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;
- begin
- open $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;
- begin
- open $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;
- begin
- open $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的,要麼是當做參數傳入的字串;除此之外,報錯!