Oracle PL/SQL 關於遊標的介紹

feelpurple發表於2016-02-05
遊標是指向私有 SQL 區(private SQL area)的指標,私有 SQL 區中儲存著關於 SELECT 或 DML 語句的處理資訊。

(1) 隱式遊標
隱式遊標是指被後臺 PL/SQL 建立和管理的會話遊標。當你執行一條 SELECT 或 DML 語句的時候,PL/SQL 會開啟一個隱式遊標。
使用者不可以控制隱式遊標,但是獲取隱式遊標的屬性。

隱式遊標的屬性如下:

SQL%ISOPEN 遊標是否開啟

SQL%FOUND 結果集中還有行數

SQL%NOTFOUND 結果集中沒有行數

SQL%ROWCOUNT 執行的行數

SQL%BULK_ROWCOUNT FORALL 語句的執行行數

SQL%BULK_EXCEPTIONS 當 FORALL 語句完成時所處理的 FORALL 異常

--例子
DROP TABLE dept_temp;
CREATE TABLE dept_temp AS
  SELECT * FROM dept;
 
CREATE OR REPLACE PROCEDURE p (
  deptno NUMBER
) AUTHID DEFINER AS
BEGIN
  DELETE FROM dept_temp
  WHERE deptno = deptno;
 
  IF SQL%FOUND THEN
    DBMS_OUTPUT.PUT_LINE (
      'Delete succeeded for department number ' || deptno
    );
  ELSE
    DBMS_OUTPUT.PUT_LINE ('No department number ' || deptno);
  END IF;
END;

SQL> BEGIN
  2    p(40);
  3    p(50);
  4  END;
  5  /
Delete succeeded for department number 40
No department number 50

PL/SQL 過程已成功完成。

(2) 顯式遊標
顯式遊標是指被使用者建立和管理的會話遊標。你必須宣告和定義一個顯式遊標,讓它和一個查詢相關聯。

--例子,迴圈顯式遊標中的結果

DECLARE
  CURSOR c1 IS
    SELECT last_name, job_id FROM hr.employees
    WHERE REGEXP_LIKE (job_id, 'S[HT]_CLERK')
    ORDER BY last_name;

  v_lastname  hr.employees.last_name%TYPE;  -- variable for last_name
  v_jobid     hr.employees.job_id%TYPE;     -- variable for job_id

  CURSOR c2 IS
    SELECT * FROM hr.employees
    WHERE REGEXP_LIKE (job_id, '[ACADFIMKSA]_M[ANGR]')
    ORDER BY job_id;

  v_employees hr.employees%ROWTYPE;  -- record variable for row of table

BEGIN
  OPEN c1;
  LOOP  -- Fetches 2 columns into variables
    FETCH c1 INTO v_lastname, v_jobid;
    EXIT WHEN c1%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE( RPAD(v_lastname, 25, ' ') || v_jobid );
  END LOOP;
  CLOSE c1;
  DBMS_OUTPUT.PUT_LINE( '-------------------------------------' );

  OPEN c2;
  LOOP  -- Fetches entire row into the v_employees record
    FETCH c2 INTO v_employees;
    EXIT WHEN c2%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE( RPAD(v_employees.last_name, 25, ' ') ||
                               v_employees.job_id );
  END LOOP;
  CLOSE c2;
END;

-------------------------------------
Higgins                  AC_MGR
Greenberg                FI_MGR
Hartstein                MK_MAN
Russell                  SA_MAN
Partners                 SA_MAN
Errazuriz                SA_MAN
Cambrault                SA_MAN
Zlotkey                  SA_MAN

PL/SQL 過程已成功完成。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26506993/viewspace-1986738/,如需轉載,請註明出處,否則將追究法律責任。

相關文章