1、下面的代碼會創(chuàng)建一個top100cur()函數(shù),該函數(shù)返回一個匿名游標(biāo)
--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();--返回匿名游標(biāo)
--fetch all from abc;--匿名游標(biāo),所以此行錯誤
2、下面的代碼會創(chuàng)建的函數(shù)會返回一個名字為abc的游標(biāo)(能發(fā)現(xiàn)差別吧?是的,是否匿名,取決于open游標(biāo)時,該游標(biāo)變量是否已經(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的游標(biāo)
fetch all from abc;--此行正確,執(zhí)行時,記得把此行與select行以前拖黑,然后F5
3、返回由調(diào)用者命名的游標(biāo)
--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的游標(biāo)
--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"游標(biāo)不能使用!
return $1;
end
$$language plpgsql;
SELECT top100cur('abc');
fetch all from "$1";
5、返回一個匿名的游標(biāo)
--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";--匿名游標(biāo),所以此行錯誤
6、返回由調(diào)用者指定的游標(biāo)(知道跟4和5的不同吧?4、5中,declare聲明的游標(biāo)變量名稱太特殊了,把匿名參數(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,也沒有被傳入的游標(biāo)變量
--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;
總結(jié):
1、declare的變量,會導(dǎo)致函數(shù)參數(shù)被隱藏(如,declare $1后,則第一個匿名參數(shù)就被隱藏了);
2、declare只是聲明一個游標(biāo),不會open游標(biāo),而沒有open的游標(biāo)是不能用的哦~
3、declare之后再open游標(biāo)時,如果這個游標(biāo)是個未綁定的(declare時沒有cursor for XXX),那么open后得到的是一個匿名游標(biāo);
4、open操作的游標(biāo)變量,要么是declare的,要么是當(dāng)做參數(shù)傳入的字符串;除此之外,報(bào)錯! 本文出自:億恩科技【www.riomediacenter.com】
服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|