時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)
為了處理SQL語句,Oracle將在內(nèi)存中分配一個區(qū)域,這就是上下文區(qū)。這個區(qū)包含了已經(jīng)處理完的行數(shù)、指向被分析語句的指針,整個區(qū)是查詢語句返回的數(shù)據(jù)行集。游標就是指向上下文區(qū)句柄或指針。
兩種游標:
一、顯示游標(需要明確定義!)
顯示游標被用于處理返回多行數(shù)據(jù)的SELECT 語句,游標名通過CURSOR….IS 語句顯示地賦給SELECT 語句。
在PL/SQL中處理顯示游標所必需的四個步驟:
1)聲明游標;CURSOR cursor_name IS select_statement
2)為查詢打開游標;OPEN cursor_name
3)取得結(jié)果放入PL/SQL變量中;
FETCH cursor_name INTO list_of_variables;
FETCH cursor_name INTO PL/SQL_record;
4)關(guān)閉游標。CLOSE cursor_name
注意:在聲明游標時,select_statement不能包含INTO子句。當使用顯示游標時,INTO子句是FETCH語句的一部分。
1、 顯式游標
select語句上 使用顯式游標
能明確訪問結(jié)果集
for循環(huán)游標
參數(shù)游標
解決多行記錄的查詢問題
fetch游標
二、隱式游標
所有的隱式游標都被假設(shè)為只返回一條記錄。
使用隱式游標時,用戶無需進行聲明、打開及關(guān)閉。PL/SQL隱含地打開、處理,然后關(guān)掉游標。
例如:
…….
SELECT studentNo,studentName
INTO curStudentNo,curStudentName
FROM StudentRecord
WHERE name=’gg’;
上述游標自動打開,并把相關(guān)值賦給對應(yīng)變量,然后關(guān)閉。執(zhí)行完后,PL/SQL變量curStudentNo,curStudentName中已經(jīng)有了值。
2、 隱式游標
單條sql語句所產(chǎn)生的結(jié)果集合
用關(guān)鍵字SQL表示隱式游標
4個屬性 %rowcount? 影響的記錄的行數(shù)? 整數(shù)
%found???? 影響到了記錄 true
%notfound? 沒有影響到記錄 true
%isopen??? 是否打開? 布爾值 永遠是false
多條sql語句 隱式游標SQL永遠指的是最后一條sql語句的結(jié)果
主要使用在update 和 delete語句上
實際操作和例子:
(1)FOR循環(huán)游標 (常用的一種游標)
--<1>定義游標
--<2>定義游標變量
--<3>使用for循環(huán)來使用這個游標
--前向游標 只能往一個方向走
--效率很高
declare
--類型定義
cursor cc is select empno,ename,job,sal
from emp where job = 'MANAGER';
--定義一個游標變量
ccrec cc%rowtype;
begin
--for循環(huán)
for ccrec in cc loop
dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
end loop;
end;
(2) fetch游標
--使用的時候 必須要明確的打開和關(guān)閉
declare
--類型定義
cursor cc is select empno,ename,job,sal
from emp where job = 'MANAGER';
--定義一個游標變量
ccrec cc%rowtype;
begin
--打開游標
open cc;
--loop循環(huán)
loop
--提取一行數(shù)據(jù)到ccrec中
fetch cc into ccrec;
--判斷是否提取到值,沒取到值就退出
--取到值cc%notfound 是false
--取不到值cc%notfound 是true
exit when cc%notfound;
dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
end loop;
--關(guān)閉游標
close cc;
end;
游標的屬性4種
%notfound? fetch是否提到數(shù)據(jù) 沒有true 提到false
%found????? fetch是否提到數(shù)據(jù) 有true 沒提到false
%rowcount? 已經(jīng)取出的記錄的條數(shù)
%isopen??? 布爾值 游標是否打開
(3)參數(shù)游標
按部門編號的順序輸出部門經(jīng)理的名字
declare
--部門
cursor c1 is select deptno from dept;
--參數(shù)游標c2,定義參數(shù)的時候
--只能指定類型,不能指定長度
--參數(shù)只能出現(xiàn)在select語句=號的右側(cè)
cursor c2(no number,pjob varchar2) is select emp.* from emp
where deptno = no and job=pjob;
c1rec c1%rowtype;
c2rec c2%rowtype;
--定義變量的時候要指定長度
v_job varchar2(20);
begin
--部門
for c1rec in c1 loop
--參數(shù)在游標中使用
for c2rec in c2(c1rec.deptno,'MANAGER') loop
dbms_output.put_line(c1rec.deptno||'-'||c2rec.ename);
end loop;
end loop;
end;
(4)引用游標/動態(tài)游標
-- select語句是動態(tài)的
declare
--定義一個類型(ref cursor)弱類型
type cur is ref cursor;
--強類型(返回的結(jié)果集有要求)
type cur1 is ref cursor return emp%rowtype;
--定義一個ref cursor類型的變量
cura cur;
c1rec emp%rowtype;
c2rec dept%rowtype;
begin
DBMS_output.put_line('輸出員工')?? ;
open cura for select * from emp;
loop
fetch cura into c1rec;
exit when cura%notfound;
DBMS_output.put_line(c1rec.ename)?? ;
end loop ;
DBMS_output.put_line('輸出部門')?? ;
open cura for select * from dept;
loop
fetch cura into c2rec;
exit when cura%notfound;
DBMS_output.put_line(c2rec.dname)?? ;
end loop;
close cura;
end;
關(guān)鍵詞標簽:oracle游標
相關(guān)閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法