OraclePL/Sql程式設計——遊標
阿新 • • 發佈:2021-02-02
遊標提供了一種從表中檢索資料並進行操作的靈活手段,遊標主要是用在伺服器上,處理由客戶端傳送到伺服器端的SQL語句,或是批處理、儲存過程、觸發器中的資料處理請求,通過遊標PL/SQL可以一次處理查詢結果的一行,並可對當前資料執行特定的操作。
一、 顯示遊標
顯示遊標是由客戶宣告和操作的一種遊標,通常用於操作查詢結果集(select 語句返回的結果集)用它處理資料的步驟包括:宣告遊標、開啟遊標、讀取遊標、關閉遊標;其中讀取遊標可能是返復的操作,因為遊標每次只能讀取一行資料,所以多條記錄時需要反覆讀,直到遊標讀不到資料為止。
- 宣告遊標
宣告遊標
主要包括遊標名稱和為遊標提供結果集的select語句
--cur_name 遊標名稱
-- ret_type 執行遊標操作後返回的值型別,可選xiang
-- input_param1 遊標的輸入引數 格式為
-- param_name [in] datatype [{:= | defaut} param_value]
cursor cur_name [(input_param1[,input_parm2]....)]
[ return ret_type ]
is select_sentence;
eg : 宣告一個遊標,用來讀取emp表中職務為銷售員(SALESMAN)的僱員資訊
declare
cursor cur_emp(var_job in varchar2:= 'SALESMAN' )
is select empn,ename,sal
from emp
where job = var_job;
- 開啟遊標
在遊標宣告完成之後才能開啟遊標
-- cur_name 要開啟遊標的名稱
--pram_value 指定輸入引數的值,是一個可選引數,在宣告遊標時定義了輸入引數,並初始化其值,在此處省略輸入引數的值,則表示將使用輸入引數的初始值
open cur_name([pram_value [,param_valu2]...])
open cur_emp('MANAMANAGER')
- 讀取遊標
讀取遊標就是逐行將結果集中的資料儲存到變數當中,語法格式如下
-- variable 一個變數列表或者“記錄”變數(RECORD型別)
fetch cur_name into { variable}
剛剛開啟遊標時,指標指向結果集的第一行,當時用fetch…into 讀取完資料後,遊標中的指標自動指向下一行資料。
eg :宣告一個檢索emp表中僱員資訊的遊標,然後開啟遊標,並制定檢索職務為‘MANAGER’ 的僱員資訊,接著用fetch into 語句和while語句迴圈讀取遊標中所有僱員的資訊
declare
cursor cur_emp(var_job in varchar2:= 'SALARMAN')
is select empno,ename,sal
from emp
where job = var_job;
type record_emp is record
(
var_empno emp.empno%type,
var_ename emp.ename%type,
var_sal emp.sal%type
)
empinfo record_emp;
begin
open cur_emp('MANAGER');
fetch cur_emp into empinfo;
while cur_emp %found loop
dbms_output.put_line(empinfo.var_ename||'標號是'||empinfo.var_empno||'工資為'||empinfo.var_sal);
end loop;
close cur_emp;
end;
- 遊標的屬性
無論是顯示遊標還是隱式遊標,都具有%found ,%notfound,%isopen,%rowcount 這四個屬性,這四個屬性可以獲得SQL語句的執行結果以及遊標的狀態資訊
- %found 布林屬性,如果SQL語句至少影響到一行資料,則 該屬性為true否則為false
- %notfound 與%found 相反
- %isopen 布林屬性 遊標開啟為true 否則為false
- %rowcount 數字型屬性,返回受SQL語句影響的行數
eg: 宣告一個遊標,用於檢索指定員工編號的僱員資訊,然後使用遊標的%found 屬性,判斷是否檢測到指定員工的資訊
declare
var_ename varchar2(20) ;
var_job varchar2(20) ;
cursor cur_emp
is select ename,job
from emp
where empno= 7396;
begin
open cur_emp;
fetch cur_emp into var_ename,var_job;
if cur_emp %found then
dbms_output.put_line('編號7396員工的名字'||var_ename||'工職務為'||var_job);
else
dbms_output.put_line('無資料記錄');
end if;
close cur_emp;
end;
二 、隱式遊標
執行一個SQL語句時,orcale會自動傳建一個隱式遊標,這個遊標是記憶體中處理該語句的工作區域,隱式遊標主要是處理資料操作語言如(UPDATE 、DELETE )的執行結果,當然特殊的情況也可以處理select語句的查詢結果。隱式遊標也有屬性,在使用隱式遊標時需要加上隱式遊標的預設名稱 sql。
eg: 把emp表中銷售人員(‘SALESMAN’)的工資上調%20,然後使用遊標%rowcount屬性輸出上調工資的員工數量。
begin
update emp set sal =sal*1.2
where job = 'SALESMAN';
if sql%notfound then
dbms_output.put_line('沒有員工上調工資');
else
dbms_output.put_line('上調工資人數為'||sql%rowcount);
end if;
end;
三 通過for語句循環遊標
- 迴圈隱式遊標
eg ; 使用for語句和隱式遊標,檢索出職務是銷售員員工資訊
set serveroutput on
begin
for emp_record in (select empno,ename,sal from emp where job = 'SALESMAN')
loop
dbms_output.put_line('員工編號'||emp_record.empno);
dbms_output.put_line('員工姓名'||emp_record.ename);
dbms_output.put_line('員工工資'||emp_record.sal);
end loop:
end;
- 迴圈顯示遊標
在 for 語句中遍歷顯示遊標中的資料時,通常在in 關鍵字後 提供遊標的名稱,語法格式如下
for var_auto_record in cur_name loop
plsql_sentence;
end loop;
eg : 使用顯示遊標和for 語句檢索出部門編號是30 的僱員資訊
declare
cursor cur_emp is
select * from emp where empno = 30;
begin
for item in cur_emp loop
dbms_output.put_line('員工編號'||item .empno);
dbms_output.put_line('員工姓名'||item .ename);
dbms_output.put_line('員工工資'||item .sal);
end loop;
end ;