oracle创建多个游标,Oracle——游标的创建和使用
游標
SQL語言是面向集合的,是對指定列的操作。如果要對列中的指定行進行操作,就必須使用游標。
當在PL/SQL塊中執行查詢語句(SELECT) 和數據操縱語句(DML) 時,Oracle會為其分配一個上下文區(Context Area)
游標是指向上下文區的指針,它為應用提供了一種對具有多行數據查詢結果集中的每一行數據分別進行單獨處理的方法
顯式游標
游標分為顯式游標和隱含游標兩種
隱含游標用于處理SELECT INTO和DML語句
顯式游標則用于處理S ELECT語句返回的多行數據
使用顯式游標
定義游標
CURSOR cursor_ name IS select statement;
打開游標
OPEN cursor name;
提取數據
FETCH cursor_name INTO variable1,variable...;
FETCH cursor_name bulk collect into collect1..;
關閉游標
CLOSE cursor name;
代碼:
--創建游標
declare
cursor 游標名稱 is select * from表名;
變量名 表名%rowtype;begin
open 游標名;--打開游標
loopfetch 游標名 into 變量名;--提取游標
exit when 游標名%notfound;
dbms_output.put_line(變量名.列名);endloop;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);--(實參)
loopfetch cursor_wxn intov_name;exit when cursor_wxn%notfound;
dbms_output.put_line(v_name.ename);endloop;closecursor_wxn;end;
游標for循環
游標for循環是在pl/sql塊中使用游標的最簡單方式,它可以簡化對游標的處理。當使用游標for循環時,oracle會隱含的打開游標,提取游標數據并關閉游標。
代碼:
--游標for循環
declarev_name emp%rowtype;cursorcursor_wxnis
select * fromemp;begin
for v_name incursor_wxn loop
dbms_output.put_line(v_name.ename);endloop;end;
上面代碼中無須進行取值和關閉的操作,游標for循環可以自己進行。
下面還有一個更為簡單的游標for循環,參考上面的代碼進行讀閱:
--簡單for
begin
for v_name in (select * fromemp) loop
dbms_output.put_line(v_name.ename);endloop;end;
使用游標變量
代碼實例:
declaretype youbiao_bianliangis ref cursor;--變量類型
cursor_varisble youbiao_bianliang;--定義游標類型的變量
v_name emp%rowtype;--變量
begin
opencursor_varisblefor select * from emp where empno=7788;
loopfetch cursor_varisble intov_name;exit when cursor_varisble%notfound;
dbms_output.put_line(v_name.ename);endloop;closecursor_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 thendbms_output.put_line('找不到記錄');elsedbms_output.put_line('記錄');end if;end;
示例2:
declareanumber:=1;begin
delete from emp where empno=a;if sql%notfound thendbms_output.put_line('沒有改變');elsedbms_output.put_line('改變');end if;end;
總結
以上是生活随笔為你收集整理的oracle创建多个游标,Oracle——游标的创建和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C、C++不定参数的使用
- 下一篇: __typeof__() 、 __typ