1. 程式人生 > >Oracle 遊標遍歷 顯式遊標 靜態遊標 OPEN v_cur(); WHILE v_cur%FOUND LOOP; LOOP FETCH v_cur INTO v_row

Oracle 遊標遍歷 顯式遊標 靜態遊標 OPEN v_cur(); WHILE v_cur%FOUND LOOP; LOOP FETCH v_cur INTO v_row

-- Created on 2018/11/6 by YXQ 
--顯示遊標 & 靜態遊標的處理
declare 
    --定義(遊標一個可以遍歷的結果集) 
    --宣告cursor,建立和命名一個sql工作區  
    --顯式遊標對應一個返回結果為多行多列的SELECT語句。
    --遊標一旦開啟,資料就從資料庫中傳送到遊標變數中,然後應用程式再從遊標變數中分解出需要的資料,並進行處理。
    CURSOR v_row_cur is  
    select * from scott.emp where empno < 7900; 
    v_row v_row_cur%rowtype;            --用rowtype接收遍歷遊標結果集記錄
    
    CURSOR v_id_cur IS
    select empno from scott.emp where empno < 7900; 
    v_id_type scott.emp.empno%type;     --用id%type接收遍歷遊標結果集記錄
    v_num_id NUMBER(11);                --用NUMBER(11)接收遍歷遊標結果集記錄
    
    cursor v_namecn_cur is  
    select ename from scott.emp where empno < 7900;
    v_var2_type_namecn10 varchar2(10);    --用varchar2(10)接收遍歷遊標結果集記錄
    v_var2_type_namecn1024 varchar2(1024);  --?? varchar2(10)也全部輸出沒有擷取,varchar2(1024)也輸出
    
begin 

    --用id%type接收select結果記錄,隱式遊標 v_id_type
    select empno into v_id_type from scott.emp where empno = 7788;
    DBMS_OUTPUT.PUT_LINE(v_id_type); 
    
    --用NUMBER(11)接收select結果記錄,隱式遊標 v_num_id
    select empno into v_num_id from scott.emp where empno = 7788;
    DBMS_OUTPUT.PUT_LINE(v_num_id); 
    
    --不可以用未定義的識別符號接收select結果記錄,因為DML操作和單行SELECT語句(單行查詢操作:SELECT ... INTO ...)會使用隱式遊標
    --select empno into rec from scott.emp where empno = 4593;   --PLS-00201: identifier 'REC' must be declared
    --DBMS_OUTPUT.PUT_LINE(rec); 
    
    
    --執行(常用For語句遍歷遊標) 
    --用rowtype接收遍歷遊標結果集記錄
    FOR v_row IN v_row_cur LOOP 
      DBMS_OUTPUT.PUT_LINE(v_row.empno); 
    END LOOP; 
       
    --用id%type接收遍歷遊標結果集記錄
    FOR v_id_type IN v_id_cur LOOP 
      DBMS_OUTPUT.PUT_LINE(v_id_type.empno); 
    END LOOP;
       
    --用隱含定義的記錄變數 record_index 收遍歷遊標結果集記錄
    FOR record_index IN v_id_cur LOOP   
      DBMS_OUTPUT.PUT_LINE(record_index.empno); 
    END LOOP;

    --用NUMBER(11)接收遍歷遊標結果集記錄
    FOR v_num_id IN v_id_cur LOOP 
      DBMS_OUTPUT.PUT_LINE(v_num_id.empno); 
    END LOOP;
    
    --用varchar2(10)接收遍歷遊標結果集記錄
    for v_var2_type_namecn10 in v_namecn_cur loop
         dbms_output.put_line(v_var2_type_namecn10.ename);
    end loop; 
        
    --用varchar2(1024)接收遍歷遊標結果集記錄
    for v_var2_type_namecn1024 in v_namecn_cur loop
         dbms_output.put_line(v_var2_type_namecn1024.ename);
    end loop; 
    
    --用隱含定義的記錄變數 preod_rec 接收遍歷遊標結果集記錄
    FOR preod_rec IN v_namecn_cur LOOP   
      DBMS_OUTPUT.PUT_LINE(preod_rec.ename); 
    END LOOP;
    
    --另一種形式的遊標迴圈,該種形式更為簡單,省略了遊標的定義,遊標的SELECT查詢語句在迴圈中直接出現。
    FOR preod_rec IN (select * from scott.emp where empno < 7900)
    LOOP   
      DBMS_OUTPUT.PUT_LINE('XH匿名遊標用法:' || preod_rec.empno || ' ' || preod_rec.ename); 
    END LOOP;
 
end;

/*    
    隱式遊標 
    如前所述,DML操作和單行SELECT語句會使用隱式遊標,它們是: 
    * 插入操作:INSERT。 
    * 更新操作:UPDATE。 
    * 刪除操作:DELETE。 
    * 單行查詢操作:SELECT ... INTO ...。 
    當系統使用一個隱式遊標時,可以通過隱式遊標的屬性來了解操作的狀態和結果,
    進而控制程式的流程。隱式遊標可以使用名字SQL來訪問,
    但要注意,通過SQL遊標名總是隻能訪問前一個DML操作或單行SELECT操作的遊標屬性。
    所以通常在剛剛執行完操作之後,立即使用SQL遊標名來訪問屬性。
    遊標的屬性有四種,如下所示。 

    Sql程式碼 

    隱式遊標的屬性 返回值型別   意    義   
    SQL%ROWCOUNT    整型  代表DML語句成功執行的資料行數   
    SQL%FOUND   布林型 值為TRUE代表插入、刪除、更新或單行查詢操作成功   
    SQL%NOTFOUND    布林型 與SQL%FOUND屬性返回值相反   
    SQL%ISOPEN  布林型 DML執行過程中為真,結束後為假  
    
 */