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

ORACLEPLSQL游標學習

2013-11-13 16:22:31  來源: Oracle 

  游標

  游標是指向上下文區域的句柄或指針

  上下文區域用於SQL處理的內存區

  上下文區域的內容

  語句處理的行數

  指向語句的語法分析表示的指針

  游標的類型

  靜態游標

  隱式游標

  顯示游標

  REF游標(動態游標)

  一隱式游標

  有ORACLE在內部聲明

  用於處理

  DML語句

  返回單行的查詢

  游標屬性

  %NOTFOUND 對數據操作成功返回FALSE否則返回TRUE

  %FOUND  對數據操作成功返回TRUE否則返回FALSE

  %ROWCOUNT  游標影響的行數

  %ISOPEN   游標是否打開

  begin

  insert into cities values(aaabbb);

  DBMS_OUTPUTPUT_LINE(游標所影響的行數||SQL%ROWCOUNT);

  if SQL%NOTFOUND then

  DBMS_OUTPUTPUT_LINE(NOTFOUND為真);

  else

  DBMS_OUTPUTPUT_LINE(NOTFOUND為假);

  end if;

  if SQL%FOUND then

  DBMS_OUTPUTPUT_LINE(FOUND為真);

  else

  DBMS_OUTPUTPUT_LINE(FOUND為假);

  end if;

  if SQL%ISOPEN then

  DBMS_OUTPUTPUT_LINE(ISOPEN為真);

  else

  DBMS_OUTPUTPUT_LINE(ISOPEN為假);

  end if;

  end;

  輸出結果為

  游標所影響的行數

  NOTFOUND為假

  FOUND為真

  ISOPEN為假

  declare

  icount int :=;

  begin

  insert into cities values (aaabbb);

  if SQL%NOTFOUND then

  DBMS_OUTPUTPUT_LINE(沒有插入成功);

  else

  DBMS_OUTPUTPUT_LINE(插入成功);

  end if;

  commit;

  end;

  輸出結果為

  插入成功

  declare

  icount int :=;

  begin

  update cities set country=aaaa;

  if SQL%NOTFOUND then

  DBMS_OUTPUTPUT_LINE(沒有更新成功);

  else

  DBMS_OUTPUTPUT_LINE(更新成功);

  end if;

  commit;

  end;

  輸出結果為

  更新成功

  二顯式游標

  由用戶顯式聲明

  游標將指向活動集中的當前行

  控制顯示游標

  Open

  Fetch

  Close

  declare

  cursor empCur is select * from emp;

  emprow emp%ROWTYPE;

  begin

  open empCur;

  fetch empCur into emprow;

  DBMS_OUTPUTput_line(emprowempno||  ||emprowename);

  close empCur;

  end;

  輸出結果

    SMITH

  loop循環

  declare

  cursor empCur is select * from emp;

  emprow emp%ROWTYPE;

  begin

  open empCur;

  loop

  fetch empCur into emprow;

  DBMS_OUTPUTput_line(emprowempno||  ||emprowename);

  DBMS_OUTPUTput_line(提取了||empCur%ROWCOUNT||);

  exit when empCur%NOTFOUND;

  if empCur%NOTFOUND then

  exit ;

  end if;

  end loop;

  close empCur;

  end;

  while循環

  declare

  cursor empCur is select * from emp;

  emprow emp%ROWTYPE;

  begin

  open empCur;

  fetch empCur into emprow;

  while empCur%FOUND loop

  DBMS_OUTPUTput_line(emprowempno||  ||emprowename);

  DBMS_OUTPUTput_line(提取了||empCur%ROWCOUNT||);

  fetch empCur into emprow;

  end loop;

  close empCur;

  end;

  輸出結果

    SMITH

  提取了

    ALLEN

  提取了

    WARD

  提取了

    JONES

  提取了

    MARTIN

  提取了

    BLAKE

  提取了

    CLARK

  提取了

    SCOTT

  提取了

    KING

  提取了

    TURNER

  提取了

    ADAMS

  提取了

    JAMES

  提取了

    FORD

  提取了

    MILLER

  提取了

    MILLER

  提取了

  for循環

  循環游標

  顯式游標的替代方法

  它的工作原理是什麼

  隱式打開游標

  自動從活動集獲取行

  在處理完所有行時關閉游標

  優點

  簡化代碼的編寫

  declare

  cursor empCur is select * from emp where sal>&intputsal;綁定變量

  iCount int ;

  begin

  iCount := &Count;

  DBMS_outputput_line(iCount);

  for emprow in empCur loop

  DBMS_OUTPUTput_line(emprowempno||  ||emprowename);

  DBMS_OUTPUTput_line(提取了||empCur%ROWCOUNT||);

  end loop;

  end;

  三REF游標

  在運行時使用不同的語句與之關聯

  REF游標使用游標變量

  游標變量

  一種引用類型

  可以在運行時指向不同的存儲位置

  Close 語句關閉游標並釋放用於查詢的資源

  游標變量的類型

  具有約束的游標變量

  具有返回類型的游標變量

  也稱為強游標

  無約束的游標變量

  沒有返回類型的游標變量

  也稱為弱游標

  declare

  type RefEmpcur is ref cursor return emp%ROWTYPE;

  Empcur RefEmpcur;

  Emprow emp%ROWTYPE;

  flag int := ;

  begin

  flag := &flag;

  if flag= then

  OPEN Empcur for select * from emp where sal> and sal<;

  elsif flag= then

  OPEN Empcur for select * from emp where sal>=;

  else

  OPEN Empcur for select * from emp;

  end if;

  loop

  fetch Empcur into Emprow;

  DBMS_OUTPUTPUT_LINE(Emprowempno);

  exit when Empcur%NOTFOUND;

  end loop;

  close Empcur;

  end;

  游標變量的限制

  不能在程序包中聲明游標變量

  遠程子程序不能接受游標變量的值

  不能使用比較操作符對游標變量進行相等或不相等測試

  不能將空值賦予游標變量

  表不能存儲游標變量的值


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