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

Oracle游標使用總結

2013-11-13 15:55:53  來源: Oracle 

  Oracle游標分為顯示游標和隱式游標

  顯示游標(Explicit Cursor):在PL/SQL程序中定義的用於查詢的游標稱作顯示游標

  隱式游標(Implicit Cursor):是指非PL/SQL程序中定義的而且是在PL/SQL中使用UPDATE/DELETE語句時Oracle系統自動分配的游標

  顯示游標

  使用步驟

  ()定義 ()打開 ()使用 ()關閉

  使用演示

  首先創建測試用表STUDENT腳本如下

  ()使用WHILE循環處理游標

  create or replace PROCEDURE PROC_STU AS

  BEGIN

  顯示游標使用使用while循環

  declare

  定義游標名稱為cur_stu

  cursor cur_stu is

  select stunostuname from student order by stuno;

  定義變量存放游標取出的數據

  v_stuno varchar();

  v_stuname varchar();

  begin

  打開游標cur_stu

  open cur_stu;

  將游標的當前行取出存放到變量中

  fetch cur_stu into v_stunov_stuname;

  while cur_stu%found 游標所指還有數據行則繼續循環

  loop

  打印結果

  dbms_outputPUT_LINE(v_stuno||>||v_stuname);

  繼續將游標所指的當前行取出放到變量中

  fetch cur_stu into v_stunov_stuname;

  end loop;

  close cur_stu; 關閉游標

  end;

  END PROC_STU;

  ()使用IFELSE代替WHILE循環處理游標

  create or replace PROCEDURE PROC_STU AS

  BEGIN

  顯示游標使用使用if判斷

  declare

  定義游標名稱為cur_stu

  cursor cur_stu is

  select stunostuname from student order by stuno;

  定義變量存放游標取出的數據

  v_stuno varchar();

  v_stuname varchar();

  begin

  打開游標cur_stu

  open cur_stu;

  將游標的當前行取出存放到變量中

  fetch cur_stu into v_stunov_stuname;

  loop

  if cur_stu%found then 如果游標cur_stu所指還有數據行

  打印結果

  dbms_outputPUT_LINE(v_stuno||>||v_stuname);

  繼續將游標所指的當前行取出放到變量中

  fetch cur_stu into v_stunov_stuname;

  else

  exit;

  end if;

  end loop;

  close cur_stu; 關閉游標

  end;

  END PROC_STU;

  ()使用FOR循環處理游標

  create or replace PROCEDURE PROC_STU AS

  BEGIN

  顯示游標使用使用for循環

  declare

  定義游標名稱為cur_stu

  cursor cur_stu is

  select stunostuname from student order by stuno;

  begin

  for stu in cur_stu

  loop

  dbms_outputPUT_LINE(stustuno||>||stustuname);

  循環做隱含檢查 %notfound

  end loop;

  自動關閉游標

  end;

  END PROC_STU;

  ()常用的使用EXIT WHEN處理游標

  create or replace

  PROCEDURE PROC_STU_ AS

  BEGIN

  顯示游標使用使用exit when循環

  declare

  定義游標名稱為cur_stu

  cursor cur_stu is

  select stunostuname from student order by stuno;

  定義變量存放游標取出的數據

  v_stuno varchar();

  v_stuname varchar();

  begin

  打開游標cur_stu

  open cur_stu;

  loop

  將游標的當前行取出存放到變量中

  fetch cur_stu into v_stunov_stuname;

  exit when cur_stu%notfound; 游標所指還有數據行則繼續循環

  打印結果

  dbms_outputPUT_LINE(v_stuno||>||v_stuname);

  end loop;

  close cur_stu; 關閉游標

  end;

  END PROC_STU_;

  隱式游標

  使用演示

  create or replace PROCEDURE PROC_STU AS

  BEGIN

  隱式游標使用

  update student set stuname=張燕廣 where stuno=;

  如果更新沒有匹配則插入一條新記錄

  if SQL%NOTFOUND then

  insert into student(STUNOSTUNAMEAGEGENDER)

  values(張燕廣);

  end if;

  END PROC_STU;

  說明

  所有的SQL語句在上下文區內部都是可執行的因為都有一個游標指向上下文區此游標就是

  SQL游標與現實游標不同的是SQL游標在PL/SQL中不需要打開和關閉而是在執行UPDATE

  DELETE是自動打開和關閉

  上面例子中就是通過SQL%NOTFOUND游標屬性判斷UPDATE語句的執行結果決定是否需要插入新記錄CREATE TABLE STUDENT (

  STUNAME VARCHAR( BYTE)

  STUNO VARCHAR( BYTE)

  AGE NUMBER

  GENDER VARCHAR( CHAR)

  )


From:http://tw.wingwit.com/Article/program/Oracle/201311/17531.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.