1. 程式人生 > >二十、遊標的屬性及帶參遊標

二十、遊標的屬性及帶參遊標

                      遊標的屬性及帶參遊標

1、%ISOPEN判斷遊標是否開啟

DECLARE
    CURSOR emp_cur
    IS SELECT * FROM EMP;      --宣告遊標
    
    
    emp_var EMP%ROWTYPE;       --宣告變數:變數emp_var是表EMP的行型別
    
    
    BEGIN                      
        IF  emp_cur%ISOPEN THEN       		--判斷遊標是否開啟
           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;
        ELSE 
          DBMS_OUTPUT.put_line('遊標emp_cur沒有被開啟');
        END IF;
    END;

2、%FOUND、%NOTFOUND判斷資料是否有效

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;      --獲取遊標資料
          IF  emp_cur%FOUND THEN
             DBMS_OUTPUT.put_line(emp_var.EMPNO ||'-'|| emp_var.ENAME||'-'||emp_var.JOB||'-'||emp_var.MGR);   
             --輸出資料
          ELSE 
            DBMS_OUTPUT.put_line('沒有資料被提取');
            EXIT;
          END IF;
        END LOOP;
      CLOSE emp_cur;                        --關閉資料  
    END;

3、%ROWCOUNT判斷條數

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;      --獲取遊標資料
          IF  emp_cur%FOUND THEN
             DBMS_OUTPUT.put_line(emp_var.EMPNO ||'-'|| emp_var.ENAME||'-'||emp_var.JOB||'-'||emp_var.MGR);   
             --輸出資料
             DBMS_OUTPUT.put_line('讀取了第'|| emp_cur%ROWCOUNT ||'條');
          ELSE 
            DBMS_OUTPUT.put_line('沒有資料被提取');
            EXIT;
          END IF;
        END LOOP;
      CLOSE emp_cur;                        --關閉資料  
    END;

結果:

7369-SMITH-CLERK-7902
讀取了第1條
7499-ALLEN-SALESMAN-7698
讀取了第2條
7521-WARD-SALESMAN-7698
讀取了第3條
7566-JONES-MANAGER-7839
讀取了第4條
7654-MARTIN-SALESMAN-7698
讀取了第5條
7698-BLAKE-MANAGER-7839
讀取了第6條
7782-CLARK-MANAGER-7839
讀取了第7條
7788-SCOTT-ANALYST-7566
讀取了第8條
7839-KING-PRESIDENT-
讀取了第9條
7844-TURNER-SALESMAN-7698
讀取了第10條
7876-ADAMS-CLERK-7788
讀取了第11條
7900-JAMES-CLERK-7698
讀取了第12條
7902-FORD-ANALYST-7566
讀取了第13條
7934-MILLER-CLERK-7782
讀取了第14條
沒有資料被提取

4、帶引數遊標

DECLARE
    CURSOR emp_cur(deptno_var NUMBER)
    IS SELECT * FROM EMP WHERE DEPTNO=deptno_var;      --宣告遊標
    
    emp_var EMP%ROWTYPE;       --宣告變數:變數emp_var是表EMP的行型別
    
    BEGIN                      
      OPEN emp_cur(30);                         --開啟遊標
           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;

結果:

7499-ALLEN-SALESMAN-7698
7521-WARD-SALESMAN-7698
7654-MARTIN-SALESMAN-7698
7698-BLAKE-MANAGER-7839
7844-TURNER-SALESMAN-7698
7900-JAMES-CLERK-7698