十九、顯式遊標的基本使用
阿新 • • 發佈:2018-12-02
顯式遊標的基本使用
遊標分兩大類:靜態遊標、動態遊標(REF遊標)
靜態遊標分兩類:顯示遊標、隱式遊標
1、顯示遊標的使用
DECLARE CURSOR emp_cur IS SELECT * FROM EMP; --宣告遊標 emp_var EMP%ROWTYPE; --宣告變數:變數emp_var是表EMP的行型別 BEGIN OPEN emp_cur; --開啟遊標 FETCH emp_cur INTO emp_var; --獲取遊標資料 DBMS_OUTPUT.put_line(emp_var.EMPNO ||'-'|| emp_var.ENAME||'-'||emp_var.JOB||'-'||emp_var.MGR); --輸出資料 CLOSE emp_cur; --關閉資料 END;
結果:
7369-SMITH-CLERK-7902
2、遊標中的LOOP語句
DECLARE CURSOR emp_cur IS SELECT * FROM EMP; --宣告遊標 emp_var EMP%ROWTYPE; --宣告變數:變數emp_var是表EMP的行型別 BEGIN OPEN emp_cur; --開啟遊標 LOOP FETCH emp_cur INTO emp_var; --獲取遊標資料 EXIT WHEN emp_cur%NOTFOUND; --結束迴圈 DBMS_OUTPUT.put_line(emp_var.EMPNO ||'-'|| emp_var.ENAME||'-'||emp_var.JOB||'-'||emp_var.MGR); --輸出資料 END LOOP; CLOSE emp_cur; --關閉資料 END;
結果:
7369-SMITH-CLERK-7902 7499-ALLEN-SALESMAN-7698 7521-WARD-SALESMAN-7698 7566-JONES-MANAGER-7839 7654-MARTIN-SALESMAN-7698 7698-BLAKE-MANAGER-7839 7782-CLARK-MANAGER-7839 7788-SCOTT-ANALYST-7566 7839-KING-PRESIDENT- 7844-TURNER-SALESMAN-7698 7876-ADAMS-CLERK-7788 7900-JAMES-CLERK-7698 7902-FORD-ANALYST-7566 7934-MILLER-CLERK-7782
3、使用FETCH…BULK COLLECT INTO批量提取資料
DECLARE
CURSOR emp_cur
IS SELECT * FROM EMP; --宣告遊標
TYPE EMP_TABLE IS TABLE OF EMP%ROWTYPE; --宣告型別
emp_var EMP_TABLE; --變數:該變數用於存放批量得到的資料(看成集合)
BEGIN
OPEN emp_cur; --開啟遊標
LOOP
FETCH emp_cur BULK COLLECT INTO emp_var LIMIT 2; --獲取遊標資料(集合),每次提取2條
FOR i IN 1..emp_var.count LOOP
DBMS_OUTPUT.put_line(emp_var(i).EMPNO ||'-'|| emp_var(i).ENAME||'-'||emp_var(i).JOB||'-'||emp_var(i).MGR);
--輸出資料
END LOOP;
EXIT WHEN emp_cur%NOTFOUND; --結束迴圈
END LOOP;
CLOSE emp_cur; --關閉資料
END;
結果:
7369-SMITH-CLERK-7902
7499-ALLEN-SALESMAN-7698
7521-WARD-SALESMAN-7698
7566-JONES-MANAGER-7839
7654-MARTIN-SALESMAN-7698
7698-BLAKE-MANAGER-7839
7782-CLARK-MANAGER-7839
7788-SCOTT-ANALYST-7566
7839-KING-PRESIDENT-
7844-TURNER-SALESMAN-7698
7876-ADAMS-CLERK-7788
7900-JAMES-CLERK-7698
7902-FORD-ANALYST-7566
7934-MILLER-CLERK-7782
4、CURSOR FOR LOOP簡化迴圈
DECLARE
CURSOR emp_cur
IS SELECT * FROM EMP; --宣告遊標
BEGIN
FOR emp_var IN emp_cur
LOOP
DBMS_OUTPUT.put_line(emp_var.EMPNO ||'-'|| emp_var.ENAME||'-'||emp_var.JOB||'-'||emp_var.MGR);
--輸出資料
END LOOP;
END;