1、下面的代碼會創(chuàng)建一個top100cur()函數(shù),該函數(shù)返回一個匿名游標
--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、下面的代碼會創(chuàng)建的函數(shù)會返回一個名字為abc的游標(能發(fā)現(xiàn)差別吧?是的,是否匿名,取決于open游標時,該游標變量是否已經(jīng)綁定)
--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;--此行正確,執(zhí)行時,記得把此行與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聲明的游標變量名稱太特殊了,把匿名參數(shù)的名字隱藏了……)
--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的變量,會導致函數(shù)參數(shù)被隱藏(如,declare $1后,則第一個匿名參數(shù)就被隱藏了);
2、declare只是聲明一個游標,不會open游標,而沒有open的游標是不能用的哦~
3、declare之后再open游標時,如果這個游標是個未綁定的(declare時沒有cursor for XXX),那么open后得到的是一個匿名游標;
4、open操作的游標變量,要么是declare的,要么是當做參數(shù)傳入的字符串;除此之外,報錯! 本文出自:億恩科技【www.cmtents.com】
服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]
|