oracle 遊標三種迴圈____oracle

來源:互聯網
上載者:User

首先定義遊標和變數

CURSOR C1 IS SELECT  eNAME,ejob FROM emp WHERE deptno=10;

v_NAME VARCHAR2(10);

v_job VARCHAR2(10);

第一種:使用loop 迴圈
open c1;
loop
fetch c1 into v_name,v_job ;
exit when c1%notfound;
……
end loop
colse c1;
這裡需要注意,exit when語句一定要緊跟在fetch之後。必避免多餘的資料處理。
而且處理邏輯需要跟在exit when之後。
迴圈結束後要記得關閉遊標。


第二種:使用while迴圈。

open c1;

fetch c1 into v_name,v_job;
while c1%found loop
……
fetch c1 into v_name,v_job;
end loop;
close c1;

注意 這裡用到了兩個fetch語句。

第一個fetch語句是把遊標的第一行記錄賦值給相關變數,第二個fetch語句是讓遊標指向下一條記錄。

如果沒有第二個語句的話,即為死迴圈,不停地執行loop內的代碼。

總之,使用while來迴圈處理遊標是最複雜的方法。


第三種: for迴圈

for v_pos in c1 loop
v_name:= v_pos.ename;
02. v_job:= v_pos.ejob;
03. …
04.end loop;
可見for迴圈是比較簡單實用的方法。
首先,它會自動open和close遊標。解決了你忘記開啟或關閉遊標的煩惱。
其它,自動定義了一個記錄類型及聲明該類型的變數,並自動fetch資料到這個變數中。
我們需要注意v_pos 這個變數無需要在迴圈外進行聲明,無需要為其指定資料類型。
它應該是一個記錄類型,具體的結構是由遊標決定的。
這個變數的範圍僅僅是在迴圈體內。
把v_pos看作一個記錄變數就可以了,如果要獲得某一個值就像調用記錄一樣就可以了。
如v_pos.pos_type
由此可見,for迴圈是用來迴圈遊標的最好方法。高效,簡潔,安全。

 

四.在遊標FOR迴圈中直接使用子查詢

BEGIN

FOR emp_record IN

(SELECT ename,sal FROM emp) LOOP

dbms_output.put_line(emp_record.ename);

END LOOP;

END;

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.