1. 程式人生 > >十九、顯式遊標的基本使用

十九、顯式遊標的基本使用

                                 顯式遊標的基本使用

遊標分兩大類:靜態遊標、動態遊標(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;