1. 程式人生 > 其它 >OraclePL/Sql程式設計——遊標

OraclePL/Sql程式設計——遊標

技術標籤:資料庫java資料庫sql

遊標提供了一種從表中檢索資料並進行操作的靈活手段,遊標主要是用在伺服器上,處理由客戶端傳送到伺服器端的SQL語句,或是批處理、儲存過程、觸發器中的資料處理請求,通過遊標PL/SQL可以一次處理查詢結果的一行,並可對當前資料執行特定的操作。

一、 顯示遊標
顯示遊標是由客戶宣告和操作的一種遊標,通常用於操作查詢結果集(select 語句返回的結果集)用它處理資料的步驟包括:宣告遊標、開啟遊標、讀取遊標、關閉遊標;其中讀取遊標可能是返復的操作,因為遊標每次只能讀取一行資料,所以多條記錄時需要反覆讀,直到遊標讀不到資料為止。
在這裡插入圖片描述

  1. 宣告遊標
    宣告遊標
    主要包括遊標名稱和為遊標提供結果集的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;
  1. 開啟遊標
    在遊標宣告完成之後才能開啟遊標
-- cur_name 要開啟遊標的名稱
--pram_value 指定輸入引數的值,是一個可選引數,在宣告遊標時定義了輸入引數,並初始化其值,在此處省略輸入引數的值,則表示將使用輸入引數的初始值
open cur_name([pram_value [,param_valu2]...])
open cur_emp('MANAMANAGER'
  1. 讀取遊標
    讀取遊標就是逐行將結果集中的資料儲存到變數當中,語法格式如下
-- 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;
  1. 遊標的屬性
    無論是顯示遊標還是隱式遊標,都具有%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語句循環遊標

  1. 迴圈隱式遊標
    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;
  1. 迴圈顯示遊標
    在 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 ;