熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

oracle游標

2013-11-13 22:10:56  來源: Oracle 

  為了處理SQL語句Oracle將在內存中分配一個區域這就是上下文區這個區包含了已經處理完的行數指向被分析語句的指針整個區是查詢語句返回的數據行集游標就是指向上下文區句柄或指針

  兩種游標

  一顯示游標(需要明確定義!)

  顯示游標被用於處理返回多行數據的SELECT 語句游標名通過CURSOR…IS 語句顯示地賦給SELECT 語句

  在PL/SQL中處理顯示游標所必需的四個步驟

  )聲明游標CURSOR cursor_name IS select_statement

  )為查詢打開游標OPEN cursor_name

  )取得結果放入PL/SQL變量中

  FETCH cursor_name INTO list_of_variables;

  FETCH cursor_name INTO PL/SQL_record;

  )關閉游標CLOSE cursor_name

  注意在聲明游標時select_statement不能包含INTO子句當使用顯示游標時INTO子句是FETCH語句的一部分

   顯式游標

  select語句上 使用顯式游標

  能明確訪問結果集

  for循環游標

  參數游標

  解決多行記錄的查詢問題

  fetch游標

  二隱式游標

  所有的隱式游標都被假設為只返回一條記錄

  使用隱式游標時用戶無需進行聲明打開及關閉PL/SQL隱含地打開處理然後關掉游標

  例如

  ……

  SELECT studentNostudentName

  INTO curStudentNocurStudentName

  FROM StudentRecord

  WHERE name=gg;

  上述游標自動打開並把相關值賦給對應變量然後關閉執行完後PL/SQL變量curStudentNocurStudentName中已經有了值

   隱式游標

  單條sql語句所產生的結果集合

  用關鍵字SQL表示隱式游標

  個屬性 %rowcount  影響的記錄的行數  整數

  %found     影響到了記錄 true

  %notfound  沒有影響到記錄 true

  %isopen    是否打開  布爾值 永遠是false

  多條sql語句 隱式游標SQL永遠指的是最後一條sql語句的結果

  主要使用在update 和 delete語句上

  實際操作和例子

  ()FOR循環游標 (常用的一種游標)

  <>定義游標

  <>定義游標變量

  <>使用for循環來使用這個游標

  前向游標 只能往一個方向走

  效率很高

  declare

  類型定義

  cursor cc is select empnoenamejobsal

  from emp where job = MANAGER;

  定義一個游標變量

  ccrec cc%rowtype;

  begin

  for循環

  for ccrec in cc loop

  dbms_outputput_line(ccrecempno||||ccrecename||||ccrecjob||||ccrecsal);

  end loop;

  end;

  () fetch游標

  使用的時候 必須要明確的打開和關閉

  declare

  類型定義

  cursor cc is select empnoenamejobsal

  from emp where job = MANAGER;

  定義一個游標變量

  ccrec cc%rowtype;

  begin

  打開游標

  open cc;

  loop循環

  loop

  提取一行數據到ccrec中

  fetch cc into ccrec;

  判斷是否提取到值沒取到值就退出

  取到值cc%notfound 是false

  取不到值cc%notfound 是true

  exit when cc%notfound;

  dbms_outputput_line(ccrecempno||||ccrecename||||ccrecjob||||ccrecsal);

  end loop;

  關閉游標

  close cc;

  end;

  游標的屬性

  %notfound  fetch是否提到數據 沒有true 提到false

  %found      fetch是否提到數據 有true 沒提到false

  %rowcount  已經取出的記錄的條數

  %isopen    布爾值 游標是否打開

  ()參數游標

  按部門編號的順序輸出部門經理的名字

  declare

  部門

  cursor c is select deptno from dept;

  參數游標c定義參數的時候

  只能指定類型不能指定長度

  參數只能出現在select語句=號的右側

  cursor c(no numberpjob varchar) is select emp* from emp

  where deptno = no and job=pjob;

  crec c%rowtype;

  crec c%rowtype;

  定義變量的時候要指定長度

  v_job varchar();

  begin

  部門

  for crec in c loop

  參數在游標中使用

  for crec in c(crecdeptnoMANAGER) loop

  dbms_outputput_line(crecdeptno||||crecename);

  end loop;

  end loop;

  end;

  ()引用游標/動態游標

   select語句是動態的

  declare

  定義一個類型(ref cursor)弱類型

  type cur is ref cursor;

  強類型(返回的結果集有要求)

  type cur is ref cursor return emp%rowtype;

  定義一個ref cursor類型的變量

  cura cur;

  crec emp%rowtype;

  crec dept%rowtype;

  begin

  DBMS_outputput_line(輸出員工)   ;

  open cura for select * from emp;

  loop

  fetch cura into crec;

  exit when cura%notfound;

  DBMS_outputput_line(crecename)   ;

  end loop ;

  DBMS_outputput_line(輸出部門)   ;

  open cura for select * from dept;

  loop

  fetch cura into crec;

  exit when cura%notfound;

  DBMS_outputput_line(crecdname)   ;

  end loop;

  close cura;

  end;


From:http://tw.wingwit.com/Article/program/Oracle/201311/18404.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.