游標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 可以返回多行記錄 宣告游標 開啟游標 提...