1. 程式人生 > >PL/SQL輕量版(三)——遊標與異常處理

PL/SQL輕量版(三)——遊標與異常處理

多個 次循環 指向 count dbms 都是 不能 weight acl

一、遊標

  1.概念

    遊標是一個 指向上下文的句柄( handle) 或指針。通過遊標,PL/SQL 可以控制上下文區和處理語句時上下文區會發生些什麽事情。

  2.遊標處理

    處理顯式遊標

    主要包含以下四個步驟:

      1.定義遊標

CURSOR cursor_name[(parameter[, parameter]…)] IS select_statement;
遊標參數只能為輸入參數,其格式為:
parameter_name [IN] datatype [{:= | DEFAULT} expression]
在指定數據類型時,不能使用長度約束。如 
NUMBER(4)、CHAR(10) 等都是錯誤的。

      2.打開遊標

--就是執行遊標所對應的 SELECT 語句,將其查詢結果放入工作區,並且指針指向工作區的首部,標識遊標結果集合。
OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];
--參數支持位置表示法和名稱表示法

      3.提取遊標數據(放入變量或記錄類型)

FETCH cursor_name INTO {variable_list | record_variable };

      4.關閉遊標

CLOSE cursor_name;

     遊標相關屬性:

%FOUND 布爾型屬性,當最近一次讀記錄時成功返回,則值為 TRUE;
%NOTFOUND 布爾型屬性,與%FOUND 相反;
%ISOPEN 布爾型屬性,當遊標已打開時返回 TRUE;
%ROWCOUNT 數字型屬性,返回已從遊標中讀取的記錄數。

   簡單示例:——WHILE循環

--打印80部門所有員工的工資
DECLARE
  v_sal employees.salary%type;
  --1.定義遊標
  CURSOR emp_sal_cursor IS
SELECT salary FROM employees WHERE department_id = 80; BEGIN --2.打開遊標 OPEN emp_sal_cursor; --3.提取遊標數據(取出當前遊標的指向的數據) FETCH emp_sal_cursor INTO v_sal; --循環操作found類似叠代器的hasNext() WHILE emp_sal_cursor%found LOOP dbms_output.put_line(salary:||v_sal); --再取一次 FETCH emp_sal_cursor INTO v_sal; END LOOP; --4.關閉遊標 CLOSE emp_sal_cursor; END;

  //當然可以使用多個變量甚至可以使用記錄類型進行操作!

 帶參數的示例如下:

  技術分享圖片

  遊標的FOR循環:   

  PL/SQL 語言提供了 遊標 FOR 循環語句,自動執行遊標的 OPEN 、FETCH 、CLOSE 語句和 循環 語句的功能
當進入循環時,遊標 FOR 循環語句 自動 打開遊標,並提取第一行遊標數據,當程序處理完 當前所提取的數
據而進入下一次循環時,遊標 FOR 循環語句自動提取下一行數據供程序處理,當提取完結果集合中的所有
數據行後結束循環,並自動關閉遊標。

FOR index_variable IN cursor_name[value[, value]…] LOOP
-- 遊標數據處理代碼
END LOOP;
index_variable 為遊標 FOR 循環語句隱含聲明的索引變量,該變量為 記錄變量,其 結構與遊標查詢語句
返回的結構集合的結構相同。在程序中可以通過引用該索引記錄變量元素來讀取所提取的遊標數據,
index_variable 中各元素的名稱與遊標查詢語句選擇列表中所制定的列名相同。 如果在遊標查詢語句的選擇
列表中存在計算列,則必須為這些計算列指定別名後才能通過遊標 FOR  循環語句中的索引變量來訪問這些
列數據

  示例:

--打印80部門所有員工的工資
DECLARE
  v_sal employees.salary%type;
  --1.定義遊標
  CURSOR emp_sal_cursor IS SELECT salary,employee_id FROM employees WHERE department_id = 80;
BEGIN
  FOR c IN emp_sal_cursor LOOP
      dbms_output.put_line(salary:||c.salary||,employee_id:||c.employee_id);
  END LOOP;
END;

    處理隱式遊標

  顯式遊標主要是用於對查詢語句的處理,尤其是在查詢結果為多條記錄的情況下;而對於非查詢語句,如修改、刪除操作,則由 ORACLE 系統自動地為這些操作設置遊標並創建其工作區,這些 由系統隱含創建的遊標稱為隱式遊標, 隱式遊標的名字為 SQL,這是由 ORACLE 系統定義的。對於隱式遊標的操作,如定義、打開、取值及關閉操作,都由 ORACLE 系統自動地完成,無需用戶進行處理。 用戶只能通過隱式遊標的相關屬性,來完成相應的操作。在隱式遊標的工作區中,所存放的數據是與用戶自定義的顯示遊標無關的、最新處理的一條 SQL 語句所包含的數據。

SQL%

    遊標屬性:

SQL%FOUND 布爾型屬性,當最近一次讀記錄時成功返回,則值為 TRUE;
SQL%NOTFOUND 布爾型屬性,與%FOUND 相反;
SQL %ROWCOUNT 數字型屬性, 返回已從遊標中讀取得記錄數;
SQL %ISOPEN 布爾型屬性, 取值總是 FALSE。SQL 命令執行完畢立即關閉隱式遊標

  示例:

--打印員工信息
DECLARE
  v_sal employees.last_name%type;
  -- &v_id表示v_id將由外部輸入
  v_id employees.employee_id%type := &v_id;
BEGIN
  UPDATE employees
  SET salary = salary*1.2
  WHERE employee_id = v_id;
  
  IF SQL%NOTFOUND THEN
     dbms_output.put_line(查無此人!);
  END IF;
END;

  更多遊標相關,參考:https://www.cnblogs.com/xcre/archive/2012/03/28/2420597.html

PL/SQL輕量版(三)——遊標與異常處理