1. 程式人生 > >PL/SQL遊標---隱式遊標操作例項

PL/SQL遊標---隱式遊標操作例項

遊標是指向這一上下文的區域。 PL/SQL通過控制游標在上下文區域。遊標持有的行(一個或多個)由SQL語句返回。行集合游標保持的被稱為活動集合。

可以命名一個游標,它可以在程式中獲取和處理SQL語句,一次返回的行引用。有兩種型別的遊標:

  • 隱式遊標

  • 顯式遊標

隱式遊標

Oracle在一個SQL語句的執行,當沒有顯式遊標的語句隱式遊標時自動建立。程式設計師無法控制隱式遊標其中的資訊。

每當發出一個DML語句(INSERT,UPDATE和DELETE),隱式遊標與此語句關聯。對於INSERT操作時,游標保持一個需要插入的資料。對於UPDATE和DELETE操作,游標標識會受到影響的行。

在PL/SQL,可以參考最近的隱式遊標的SQL遊標,它有類似%FOUND,%ISOPEN,%NOTFOUND,和%ROWCOUNT屬性。在SQL遊標有額外的屬性,%BULK_ROWCOUNT和%BULK_EXCEPTIONS,設計用於所有語句中使用。下表提供了最常用的屬性的描述:

屬性描述
%FOUND返回TRUE如果一個INSERT,UPDATE或DELETE語句影響了一行或多行或SELECT INTO語句返回一行或多行。否則,它將返回FALSE。
%NOTFOUND邏輯相反%FOUND。返回TRUE如果一個INSERT,UPDATE或DELETE語句影響沒有行或SELECT INTO語句返回任何行。否則,它將返回FALSE。
%ISOPEN隱式遊標總是返回FALSE,因為Oracle執行其相關的SQL語句之後自動關閉SQL遊標。
%ROWCOUNT返回受INSERT,UPDATE影響的行數,或DELETE語句,或者通過一個SELECT INTO語句返回。

任何SQL遊標屬性將被訪問,SQL%attribute_name如示例圖所示。

以表emp為操作物件,操作前:


隱式遊標使用例項原始碼視窗截圖:


隱式遊標使用例項原始碼:

-- Created on 2018/3/29 by E.WANG 
/*
Oracle在一個SQL語句的執行,當沒有顯式遊標的語句隱式遊標時自動建立。
程式設計師無法控制隱式遊標其中的資訊。
每當發出一個DML語句(INSERT,UPDATE和DELETE),隱式遊標與此語句關聯。
對於INSERT操作時,游標保持一個需要插入的資料。
對於UPDATE和DELETE操作,游標標識會受到影響的行。
在PL/SQL,可以參考最近的隱式遊標的SQL遊標,它有類似%FOUND,%ISOPEN,%NOTFOUND,和%ROWCOUNT屬性。
在SQL遊標有額外的屬性,%BULK_ROWCOUNT和%BULK_EXCEPTIONS,設計用於所有語句中使用。
*/
declare 
  --用於儲存更改的行數
  countRows integer;
begin
  --更新表emp給每個員工減一千元
  update emp set sal=sal-1000;
  
  --使用隱式遊標SQL%NOTFOUND
  --如果為true說明對元資料沒有變化
  if sql%notfound then
     dbms_output.put_line('no employee update');
  --使用隱式遊標SQL%FOUND
  --如果為true說明對元資料有變化
  elsif sql%found then
     --%rowcount用於儲存受影響的行數
     countRows:=sql%rowcount;
     dbms_output.put_line(countRows ||' employee update'); 
  end if;   
  
end;

執行結果截圖: