Oracle入門(十四 12)之游標FOR迴圈

2021-08-20 09:35:21 字數 3485 閱讀 1545

游標for迴圈處理顯式游標中的行。 這是乙個快捷方式,因為游標被開啟,迴圈中的每次迭代都會獲取一次行,當處理最後一行時會退出迴圈,並且游標會自動關閉。 當最後一行被提取時,迴圈本身在迭代結束時自動終止。

for record_name in cursor_name loop

statement1;

statement2;

. . .

end loop;

在語法中:

•record_name是隱式宣告的記錄的名稱(作為cursor_name%rowtype)

•cursor_name是先前宣告的游標的pl / sql識別符號

注意:v_emp_record是隱式宣告的記錄。 

可以使用此隱式記錄訪問獲取的資料, 通過使用into子句,沒有宣告變數來儲存獲取的資料。 該**沒有open和close語句分別開啟和關閉游標。

declare

cursor emp_cursor is

select employee_id, last_name from employees

where department_id = 50;

begin

for v_emp_record in emp_cursor

loop

dbms_output.put_line(v_emp_record.employee_id

|| ' ' ||v_emp_record.last_name);

end loop;

end;

將游標for迴圈**與您在前一文中學到的展開**進行比較。 這兩種形式的**在邏輯上彼此相同,並產生完全相同的結果。

declare

cursor emp_cursor is

select employee_id, last_name

from employees

where department_id = 50;

begin

for v_emp_record in emp_cursor

loop

dbms_output.put_line(…);

end loop;

end;

declare

cursor emp_cursor is

select employee_id, last_name

from employees

where department_id = 50;

v_emp_record emp_cursor%rowtype;

begin

open emp_cursor;

loop

fetch emp_cursor into

v_emp_record;

exit when emp_cursor%notfound;

dbms_output.put_line(…);

end loop;

close emp_cursor;

end;

已將v_dept_record隱式宣告為dept_cursor%rowtype。 它包含多少個字段?
declare

cursor dept_cursor is

select department_id, department_name

from departments

order by department_id;

begin

for v_dept_record in dept_cursor

loop

dbms_output.put_line( v_dept_record.department_id

|| ' ' ||v_dept_record.department_name);

end loop;

end;

•不要宣告控制迴圈的記錄,因為它是隱式宣告的。

•隱式記錄的範圍僅限於迴圈,因此無法在迴圈外引用記錄。

•您可以通過record_name.column_name訪問獲取的資料。

您仍然可以測試游標屬性,例如%rowcount。 在取出並處理了五行後,此示例從迴圈中退出。 游標自動關閉。

declare

cursor emp_cursor is

select employee_id, last_name from employees;

begin

for v_emp_record in emp_cursor

loop

exit when emp_cursor%rowcount > 5;

dbms_output.put_line( v_emp_record.employee_id

|| ' ' ||v_emp_record.last_name);

end loop;

end;

你可以更進一步。 你根本不需要宣告游標! 相反,您可以直接在for迴圈中指定游標所基於的select。 這樣做的好處是所有的游標定義都包含在乙個for ...語句中。 這使**的後續更改變得更加容易和快速。

例子for語句中的select子句在技術上是乙個子查詢,因此您必須將其放在括號中。

begin

for v_emp_record in (select employee_id, last_name

from employees where department_id =50)

loop

dbms_output.put_line(v_emp_record.employee_id

||' '||v_emp_record.last_name);

end loop;

end;

再次,比較這兩種形式的**。 它們在邏輯上是相同的。 但是你寧願寫哪乙個?

begin

for v_dept_rec in (select *

from departments)

loop

dbms_output.put_line(…);

end loop;

end;

declare

cursor dept_cursor is

select * from departments;

v_dept_rec

dept_cursor%rowtype;

begin

open dept_cursor;

loop

fetch dept_cursor into

v_dept_rec;

exit when

dept_cursor%notfound;

dbms_output.put_line(…);

end loop;

close dept_cursor;

end;

入門oracle之游標

在寫oracle資料庫函式的時候,往往會返回乙個結果集,我們通過游標來實現這個操作,它的語法是 cursor 游標名 引數名 資料型別 引數名 資料型別 is select 語句 ex cusor a1 is select name from 表名 定義乙個a1的游標返回乙個表的所有name值。使用...

oracle存過之游標

游標的最簡單結構是 declare 定義乙個游標 cursor vrows is select from area where parent area 340000 游標的單列 vrow area rowtype begin 開啟游標 open vrows 迴圈 loop 注入,相當於for迴圈 f...

Oracle之游標 使用(續)

上節回顧 1 游標 隱式游標 select into from where dml命令 屬性 sql isopen 假的 關閉的 sql found sql notfound sql rowcount 受影響行數 顯式游標 select from where 可以返回多行記錄 宣告游標 開啟游標 提...