分爲顯式遊標和隱式遊標。
是一種引用類型,類似於指針。
Select語句
生命週期:
解析,綁定。。。不會從數據庫檢索數據
執行查詢,返回結果集。通常定義局域變量作爲從遊標獲取數據的緩衝區。
完成遊標處理,用戶不能從遊標中獲取行。還可以重新打開。
set serveroutput on
declare
cursor emp_cur ( p_deptid in number) is
select * from employees where department_id = p_deptid;
begin
dbms_output.put_line('Getting employees from department 30');
open emp_cur(30);
loop
fetch emp_cur into l_emp;
exit when emp_cur%notfound;
dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');
dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);
end loop;
close emp_cur;
open emp_cur(90);
loop
fetch emp_cur into l_emp;
exit when emp_cur%notfound;
dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');
dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);
end loop;
close emp_cur;
end;
/
begin
update departments set department_name=department_name;
--where 1=2;
dbms_output.put_line('update '|| sql%rowcount ||' records');
end;
/
b.舉例:
begin
for my_dept_rec in ( select department_name, department_id from departments)
loop
dbms_output.put_line(my_dept_rec.department_id || ' : ' || my_dept_rec.department_name);
end loop;
end;
/
c.舉例:
l_empno emp.EMPLOYEE_ID%type;
-- l_ename emp.ename%type;
begin
select EMPLOYEE_ID
into l_empno
from emp;
--where rownum =1;
dbms_output.put_line(l_empno);
end;
/
使用 INTO獲取值,只能返回一行。
%NOTFOUND:變量最後從遊標中獲取記錄的時候,在結果集中沒有找到記錄。
%ROWCOUNT:當前時刻已經從遊標中獲取的記錄數量。
%ISOPEN:是否打開。
Declare
Cursor emps is
Select * from employees where rownum<6 order by 1;
Emp employees%rowtype;
Row number :=1;
Begin
Open emps;
Fetch emps into emp;
Loop
If emps%found then
Dbms_output.put_line('Looping over record '||row|| ' of ' || emps%rowcount);
Fetch emps into emp;
Row := row + 1;
Elsif emps%notfound then
Exit; ---exit loop, not IF
End if;
End loop;
If emps%isopen then
Close emps;
End if;
End;
/
1.強類型(限制) REF CURSOR,規定返回類型
2.弱類型(非限制) REF CURSOR,不規定返回類型,可以獲取任何結果集。
TYPE ref_cursor_name IS REF CURSOR [RETURN return_type]
Declare
Type refcur_t is ref cursor;
Type emp_refcur_t is ref cursor return employee%rowtype;
Begin
Null;
End;
/
強類型舉例:
--聲明記錄類型
type emp_job_rec is record(
employee_id number,
employee_name varchar2(50),
job_title varchar2(30)
);
--聲明 REF CURSOR,返回值爲該記錄類型
type emp_job_refcur_type is ref cursor
return emp_job_rec;
--定義 REF CURSOR遊標的變量
emp_refcur emp_job_refcur_type;
begin
open emp_refcur for
select e.employee_id,
e.first_name || ' ' ||e.last_name "employee_name",
j.job_title
from employees e, jobs j
where e.job_id = j.job_id and rownum < 11 order by 1;
while emp_refcur%found loop
dbms_output.put_line(emp_job.employee_name || '''s job is ');
dbms_output.put_line(emp_job.job_title);
fetch emp_refcur into emp_job;
end loop;
end;
/