-- 宣告遊標;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;