遊標作為一種資料類型,首先必須進行定義,其文法如下。
cursor 遊標名 is select 語句;
cursor是定義遊標的關鍵詞,select是建立遊標的資料表查詢命令。
以scott使用者串連資料庫,在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義tempsal為與scott.emps資料表中的sal欄位類型相同的變數,mycursor為從scott.emp資料表中提取的sal大於tempsal的資料構成的遊標。
執行結果如圖9.35所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
declare
tempsal scott.emp.sal%type;
cursor mycursor is
select * from scott.emp
where sal>tempsal;
begin
tempsal:=800;
open mycursor;
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\ cursordefine.sql。
開啟遊標
要使用建立好的遊標,接下來要開啟遊標,文法結構如下:
open 遊標名;
開啟遊標的過程有以下兩個步驟:
(1)將合格記錄送入記憶體。
(2)將指標指向第一條記錄。
提取遊標資料
要提取遊標中的資料,使用fetch命令,文法形式如下。
fetch 遊標名 into 變數名1, 變數名2,……;
或
fetch 遊標名 into 記錄型變數名;
在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義cursorrecord變數是遊標mycursor的記錄行變數,在遊標mycursor的結果中找到sal欄位大於800的第一個記錄,顯示deptno欄位的內容。
執行結果如圖9.36所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
declare
tempsal scott.emp.sal%type;
cursor mycursor is
select * from scott.emp
where sal>tempsal;
cursorrecord mycursor%rowtype;
begin
tempsal:=800;
open mycursor;
fetch mycursor into cursorrecord;
dbms_output.put_line(to_char(cursorrecord.deptno));
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\ cursorfetch.sql。
關閉遊標
使用完遊標後,要關閉遊標,使用close命令,文法形式如下:
close 遊標名;
遊標的屬性
遊標提供的一些屬性可以協助編寫PL/SQL程式,遊標屬性的使用方法為:遊標名[屬性],例如mycursor%isopen,主要的遊標屬性如下。
1. %isopen屬性
該屬性功能是測試遊標是否開啟,如果沒有開啟遊標就使用fetch語句將提示錯誤。
在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式利用%isopen屬性判斷遊標是否開啟。執行結果如圖9.37所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
declare
tempsal scott.emp.sal%type;
cursor mycursor is
select * from scott.emp
where sal>tempsal;
cursorrecord mycursor%rowtype;
begin
tempsal:=800;
if mycursor%isopen then
fetch mycursor into cursorrecord;
dbms_output.put_line(to_char(cursorrecord.deptno));
else
dbms_output.put_line('遊標沒有開啟!');
end if;
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\ isopenattribute.sql。
2. %found屬性
該屬性功能是測試前一個fetch語句是否有值,有值將返回true,否則為false。
在【SQLPlus Worksheet】中執行下列PL/SQL程式。該程式利用%found屬性判斷遊標是否有資料。
執行結果如圖9.38所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
declare
tempsal scott.emp.sal%type;
cursor mycursor is
select * from scott.emp
where sal>tempsal;
cursorrecord mycursor%rowtype;
begin
tempsal:=800;
open mycursor;
fetch mycursor into cursorrecord;
if mycursor%found then
dbms_output.put_line(to_char(cursorrecord.deptno));
else
dbms_output.put_line('沒有資料!');
end if;
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\ foundattribute.sql。