Oracle的遊標使用方法 三種迴圈
阿新 • • 發佈:2019-02-20
例: 遊標 LOOP循環遊標
SET SERVERIUTPUT ON
DECLARE
R_emp EMP%ROWTYPE;
CURSOR c_emp IS SELECT * FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO r_emp;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);
END LOOP;
CLOSE c_emp;
END;
帶引數的遊標
DECLARE
cursor c_columns(t_table_name varchar) is select column_name from user_tab_columns where table_name = t_table_name;
BEGIN
open c_columns('TABLE_NAME');
fetch c_columns into v_column;
if c_columns%found then
dbms_output.put_line('列名為:'||v_column);
end if;
close c_columns;
END;
第二種:使用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;
v_job:= v_pos.ejob;
…
end loop;
可見for迴圈是比較簡單實用的方法。
首先,它會自動open和close遊標。解決了你忘記開啟或關閉遊標的煩惱。
其它,自動定義了一個記錄型別及宣告該型別的變數,並自動fetch資料到這個變數中。
我們需要注意v_pos 這個變數無需要在迴圈外進行宣告,無需要為其指定資料型別。
它應該是一個記錄型別,具體的結構是由遊標決定的。
這個變數的作用域僅僅是在迴圈體內。
把v_pos看作一個記錄變數就可以了,如果要獲得某一個值就像呼叫記錄一樣就可以了。
如v_pos.pos_type
由此可見,for迴圈是用來循環遊標的最好方法。高效,簡潔,安全。