IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)Oracle → oracle游標(biāo)

oracle游標(biāo)

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(1)

  為了處理SQL語(yǔ)句,Oracle將在內(nèi)存中分配一個(gè)區(qū)域,這就是上下文區(qū)。這個(gè)區(qū)包含了已經(jīng)處理完的行數(shù)、指向被分析語(yǔ)句的指針,整個(gè)區(qū)是查詢語(yǔ)句返回的數(shù)據(jù)行集。游標(biāo)就是指向上下文區(qū)句柄或指針。

  兩種游標(biāo):

  一、顯示游標(biāo)(需要明確定義?。?/p>

  顯示游標(biāo)被用于處理返回多行數(shù)據(jù)的SELECT 語(yǔ)句,游標(biāo)名通過(guò)CURSOR….IS 語(yǔ)句顯示地賦給SELECT 語(yǔ)句。

  在PL/SQL中處理顯示游標(biāo)所必需的四個(gè)步驟:

  1)聲明游標(biāo);CURSOR cursor_name IS select_statement

  2)為查詢打開(kāi)游標(biāo);OPEN cursor_name

  3)取得結(jié)果放入PL/SQL變量中;

  FETCH cursor_name INTO list_of_variables;

  FETCH cursor_name INTO PL/SQL_record;

  4)關(guān)閉游標(biāo)。CLOSE cursor_name

  注意:在聲明游標(biāo)時(shí),select_statement不能包含INTO子句。當(dāng)使用顯示游標(biāo)時(shí),INTO子句是FETCH語(yǔ)句的一部分。

  1、 顯式游標(biāo)

  select語(yǔ)句上 使用顯式游標(biāo)

  能明確訪問(wèn)結(jié)果集

  for循環(huán)游標(biāo)

  參數(shù)游標(biāo)

  解決多行記錄的查詢問(wèn)題

  fetch游標(biāo)

  二、隱式游標(biāo)

  所有的隱式游標(biāo)都被假設(shè)為只返回一條記錄。

  使用隱式游標(biāo)時(shí),用戶無(wú)需進(jìn)行聲明、打開(kāi)及關(guān)閉。PL/SQL隱含地打開(kāi)、處理,然后關(guān)掉游標(biāo)。

  例如:

  …….

  SELECT studentNo,studentName

  INTO curStudentNo,curStudentName

  FROM StudentRecord

  WHERE name=’gg’;

  上述游標(biāo)自動(dòng)打開(kāi),并把相關(guān)值賦給對(duì)應(yīng)變量,然后關(guān)閉。執(zhí)行完后,PL/SQL變量curStudentNo,curStudentName中已經(jīng)有了值。

  2、 隱式游標(biāo)

  單條sql語(yǔ)句所產(chǎn)生的結(jié)果集合

  用關(guān)鍵字SQL表示隱式游標(biāo)

  4個(gè)屬性 %rowcount? 影響的記錄的行數(shù)? 整數(shù)

  %found???? 影響到了記錄 true

  %notfound? 沒(méi)有影響到記錄 true

  %isopen??? 是否打開(kāi)? 布爾值 永遠(yuǎn)是false

  多條sql語(yǔ)句 隱式游標(biāo)SQL永遠(yuǎn)指的是最后一條sql語(yǔ)句的結(jié)果

  主要使用在update 和 delete語(yǔ)句上

  實(shí)際操作和例子:

  (1)FOR循環(huán)游標(biāo) (常用的一種游標(biāo))

  --<1>定義游標(biāo)

  --<2>定義游標(biāo)變量

  --<3>使用for循環(huán)來(lái)使用這個(gè)游標(biāo)

  --前向游標(biāo) 只能往一個(gè)方向走

  --效率很高

  declare

  --類型定義

  cursor cc is select empno,ename,job,sal

  from emp where job = 'MANAGER';

  --定義一個(gè)游標(biāo)變量

  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游標(biāo)

  --使用的時(shí)候 必須要明確的打開(kāi)和關(guān)閉

  declare

  --類型定義

  cursor cc is select empno,ename,job,sal

  from emp where job = 'MANAGER';

  --定義一個(gè)游標(biāo)變量

  ccrec cc%rowtype;

  begin

  --打開(kāi)游標(biāo)

  open cc;

  --loop循環(huán)

  loop

  --提取一行數(shù)據(jù)到ccrec中

  fetch cc into ccrec;

  --判斷是否提取到值,沒(méi)取到值就退出

  --取到值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)閉游標(biāo)

  close cc;

  end;

  游標(biāo)的屬性4種

  %notfound? fetch是否提到數(shù)據(jù) 沒(méi)有true 提到false

  %found????? fetch是否提到數(shù)據(jù) 有true 沒(méi)提到false

  %rowcount? 已經(jīng)取出的記錄的條數(shù)

  %isopen??? 布爾值 游標(biāo)是否打開(kāi)

  (3)參數(shù)游標(biāo)

  按部門編號(hào)的順序輸出部門經(jīng)理的名字

  declare

  --部門

  cursor c1 is select deptno from dept;

  --參數(shù)游標(biāo)c2,定義參數(shù)的時(shí)候

  --只能指定類型,不能指定長(zhǎng)度

  --參數(shù)只能出現(xiàn)在select語(yǔ)句=號(hào)的右側(cè)

  cursor c2(no number,pjob varchar2) is select emp.* from emp

  where deptno = no and job=pjob;

  c1rec c1%rowtype;

  c2rec c2%rowtype;

  --定義變量的時(shí)候要指定長(zhǎng)度

  v_job varchar2(20);

  begin

  --部門

  for c1rec in c1 loop

  --參數(shù)在游標(biāo)中使用

  for c2rec in c2(c1rec.deptno,'MANAGER') loop

  dbms_output.put_line(c1rec.deptno||'-'||c2rec.ename);

  end loop;

  end loop;

  end;

  (4)引用游標(biāo)/動(dòng)態(tài)游標(biāo)

  -- select語(yǔ)句是動(dòng)態(tài)的

  declare

  --定義一個(gè)類型(ref cursor)弱類型

  type cur is ref cursor;

  --強(qiáng)類型(返回的結(jié)果集有要求)

  type cur1 is ref cursor return emp%rowtype;

  --定義一個(gè)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)鍵詞標(biāo)簽:oracle游標(biāo)

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句 ORACLE和SQL語(yǔ)法區(qū)別歸納(1) oracle grant 授權(quán)語(yǔ)句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法