遊標sql
- SQL語言是面向集合的,是對指定列的操做。若是要對列中的指定行進行操做,就必須使用遊標。
- 當在PL/SQL塊中執行查詢語句(SELECT) 和數據操縱語句(DML) 時,Oracle會爲其分配一個上下文區(Context Area)
- 遊標是指向上下文區的指針,它爲應用提供了一種對具備多行數據查詢結果集中的每一行數據分別進行單獨處理的方法
顯式遊標oracle
遊標分爲顯式遊標和隱含遊標兩種oop
- 隱含遊標用於處理SELECT INTO和DML語句
- 顯式遊標則用於處理S ELECT語句返回的多行數據
- 使用顯式遊標
定義遊標fetch
CURSOR cursor_ name IS select statement;spa
打開遊標指針
OPEN cursor name;code
提取數據blog
FETCH cursor_name INTO variable1,variable...;it
FETCH cursor_name bulk collect into collect1..;for循環
關閉遊標
CLOSE cursor name;
代碼:
--建立遊標 declare cursor 遊標名稱 is select * from 表名; 變量名 表名%rowtype; begin open 遊標名;--打開遊標 loop fetch 遊標名 into 變量名;--提取遊標 exit when 遊標名%notfound; dbms_output.put_line(變量名.列名); end loop; close 遊標名;--關閉遊標 end;
顯示遊標屬性
顯式遊標屬性用於返回顯式遊標的執行信息
- 遊標屬性使用格式爲: 遊標名+ 屬性名
- %ISOPEN
用於肯定遊標是否已經打開。若是遊標已經打開,則返回值爲TRUE; 不然返回FALSE
- %FOUND
檢查是否從結果集中提取到數據。若是提取到數據,則返回值爲TRUE; 不然返回FALSE
- %NOTFOUND
與%FOUND屬性剛好相反,若是提取到數據,則返回值爲FALSE; 不然返回TRUE
- %ROWCOUNT
返回到當前行爲止已經提取到的實際行數
參數遊標
參數遊標是指帶有參數的遊標。在定義了參數遊標以後,使用不一樣參數值屢次打開遊標能夠生成不一樣的結果集。
代碼:
--參數遊標 declare cursor cursor_wxn(x_empno number)--定義參數(形參) is select * from emp where empno=x_empno; v_name emp%rowtype; begin open cursor_wxn(7369);--(實參) loop fetch cursor_wxn into v_name; exit when cursor_wxn%notfound; dbms_output.put_line(v_name.ename); end loop; close cursor_wxn; end;
遊標for循環
遊標for循環是在pl/sql塊中使用遊標的最簡單方式,它能夠簡化對遊標的處理。當使用遊標for循環時,oracle會隱含的打開遊標,提取遊標數據並關閉遊標。
代碼:
--遊標for循環 declare v_name emp%rowtype; cursor cursor_wxn is select * from emp; begin for v_name in cursor_wxn loop dbms_output.put_line(v_name.ename); end loop; end;
上面代碼中無須進行取值和關閉的操做,遊標for循環能夠本身進行。
下面還有一個更爲簡單的遊標for循環,參考上面的代碼進行讀閱:
--簡單for begin for v_name in (select * from emp) loop dbms_output.put_line(v_name.ename); end loop; end;
使用遊標變量
代碼實例:
declare type youbiao_bianliang is ref cursor;--變量類型 cursor_varisble youbiao_bianliang;--定義遊標類型的變量 v_name emp%rowtype;--變量 begin open cursor_varisble for select * from emp where empno=7788; loop fetch cursor_varisble into v_name; exit when cursor_varisble%notfound; dbms_output.put_line(v_name.ename); end loop; close cursor_varisble; end;
隱含遊標
做用:用屬性進行一些判斷(一種判斷方式)
含義:當執行一條DML語句或者SELECT...INTO語句時,都會建立一個隱含遊標。
隱含遊標的名稱是SQL,不能對SQL遊標顯示執行OPEN、FETCH和CLOSE語句。
Oracle隱式地打開、提取,並老是自動地關閉SQL遊標。
屬性:
- SQL%FOUND:只有DML語句影響一行或多行時,SQL%FOUND屬性才返回true。
- SQL%NOTDOUND:若是DNL語句沒有影響行數,此屬性將返回false。
- SQL%ROWCOUNT:返回DML影響的行數,若是DML語句沒有影響行則返回0.
- SQL%ISOPEN:此屬性用於判斷SQL遊標是否已經打開。在執行SQL語句以後,Oracle自動關閉SQL遊標,因此隱含遊標的SQL%ISOPEN屬性始終爲false。
簡單示例1:
-- 隱含遊標 begin delete from emp where empno=1; if sql%notfound then dbms_output.put_line('找不到記錄'); else dbms_output.put_line('記錄'); end if; end;
示例2:
declare a number:=1; begin delete from emp where empno=a; if sql%notfound then dbms_output.put_line('沒有改變'); else dbms_output.put_line('改變'); end if; end;