1. 程式人生 > >Oracle 遊標for迴圈

Oracle 遊標for迴圈

/*
遊標的for迴圈
pl/sql語言提供了遊標的for迴圈語句,【自動執行遊標的open,fetch,close語句和迴圈語句的功能】,當進入迴圈時,
遊標for迴圈語句自動開啟遊標,並提取第一行遊標的資料,當程式處理完成當前所提取的資料而進入下一次迴圈時,
遊標for迴圈語句自動提取下一行資料供程式處理,當提取完結果集合中的所有資料行結束迴圈,並自動關閉遊標;
for index_variable in cursor_name[(value[,value]...)] Loop
  --遊標處理程式碼
end loop;

其中index_variable為遊標for迴圈語句隱含宣告的索引變數,該變數為記錄變數,其結構與遊標查詢語句返回的
的結構集合相同,在程式中可以通過引用索引記錄變數元素來讀取所提取的遊標資料,index_variable中各元素的
名稱與遊標查詢語句選擇列表中所制定的列名相同,如果在遊標查詢語句的選擇列表中存在計算列,則必須為這些
計算列指定別名後才能通過遊標for迴圈語句中的索引變數來訪問這些列資料;
::不要在程式中對遊標進行人工操作,不要在程式中定義用於控制for迴圈的記錄::
*/
declare 
 cursor c_sal is select emp.empno,emp.ename,emp.sal from emp;
begin
 for v_sal in c_sal loop
   -- 隱含開啟遊標:隱含監測c_sal%notfound:隱含關閉遊標
   dbms_output.put_line(to_char(v_sal.empno)||'....'||v_sal.ename||to_char(v_sal.sal));
    end loop;
end;

/*
 ::當所宣告的遊標帶有引數時候,通過遊標for迴圈語句為遊標傳遞引數::
 ::可以將遊標看做是一個方法,帶引數的方法
*/
declare 
  cursor c_cursor(dept_no number default 10)
  is 
  select dept.dname,dept.loc from dept where dept.deptno <= dept_no;
begin
  dbms_output.put_line('當dept_no 的引數為30時:');
  for c1_rec in c_cursor(30) loop
    dbms_output.put_line(c1_rec.dname||':'||c1_rec.loc);
    end loop;
end;

/*
pl/sql 還允許在遊標for迴圈語句中使用子查詢來實現遊標的功能
*/
declare 
 
begin
  for c1_rec in (select dept.dname,dept.loc from dept) loop
    dbms_output.put_line(c1_rec.dname||'...'||c1_rec.loc);
  end loop;
end;