Oracle遊標示例

一路前行發表於2015-08-28
-- 宣告遊標;CURSOR cursor_name IS select_statement

--For 迴圈遊標
--(1)定義遊標
--(2)定義遊標變數
--(3)使用for迴圈來使用這個遊標
declare
       --型別定義
       cursor c_job
       is
       select empno,ename,job,sal
       from emp
       where job='MANAGER';
       --定義一個遊標變數v_cinfo c_emp%ROWTYPE ,該型別為遊標c_emp中的一行資料型別
       c_row c_job%rowtype;
begin
       for c_row in c_job loop
         dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
       end loop;
end;

實際工作中的例子:

declare 
       v_temp NUMBER;           --定義變數
       v_part_id VARCHAR2(20);  --定義變數
       cursor c_job            --定義遊標
       is
       SELECT DEPT_ID,DEPT_CODE,DEPT_TYPE 
       from PUB_DEPART_INFO
       ORDER BY DEPT_ID;
       c_row c_job%rowtype;     --定義變數c_row,型別為遊標c_job中的一行資料
begin
       open c_job;              --開啟遊標
         
         loop                            --開始迴圈
           fetch c_job into c_row;      --讀取一行資料
           exit when c_job%notfound;    --資料為空時退出(即:迴圈完成時)
              if c_row.DEPT_CODE is NULL then   --欄位資料的呼叫方式c_row.DEPT_CODE,其中DEPT_CODE為資料庫中的列名
                 IF c_row.DEPT_TYPE = 1 then
                      v_temp := 0;
                      select Max(DEPT_CODE)+1 into v_part_id from  PUB_DEPART_INFO WHERE DEPT_TYPE = '1';
                                        
                      update PUB_DEPART_INFO set DEPT_CODE = v_part_id
                      where DEPT_ID = c_row.DEPT_ID;

                  ELSE
                      v_temp := v_temp + 1;
                      IF v_temp < 10 THEN
                           update PUB_DEPART_INFO set DEPT_CODE = (v_part_id || '0000' || v_temp)
                           where DEPT_ID = c_row.DEPT_ID;
                      ELSE
                           update PUB_DEPART_INFO set DEPT_CODE = (v_part_id || '000' || v_temp)
                           where DEPT_ID = c_row.DEPT_ID;
                      END IF;
                   END IF;
              end if;
         end loop;                      --結束迴圈
      close c_job;                       --關閉遊標
end;

 

相關文章