--游標
--顯式游標
--顯式游標的使用方式
--4個步驟
--定義游標
--語法:cursor 游標名 is 查詢子句
--開啟游標
--語法: open 游標名
--獲取結果(遍歷游標)
--語法:fetch 游標名 into 變數
--關閉游標
--語法:close 游標名
declare
cursor cur_stu is
select * from student;
rec_stu student%rowtype;
begin
open cur_stu;
fetch cur_stu
into rec_stu;
close cur_stu;
dbms_output.put_line(rec_stu.s_name);
end;
declare
--定義乙個游標,游標指向的結果集是後面查詢的結果
cursor cur_stu is
select * from student;
--定義記錄型別,獲取一行結果
rec_stu student%rowtype;
begin
--開啟游標(執行查詢)
open cur_stu;
--通過迴圈,遍歷結果集
loop
--fetch 將游標指向下一行,into將該行的值放到記錄中
fetch cur_stu
into rec_stu;
--獲取游標的%notfound屬性,如果沒有取到下一行,屬性值為ture;
--如果為ture,意味著沒有下一行了,跳出迴圈
exit when cur_stu%notfound;
--如果沒有跳出迴圈,意味著有下一行,輸出他的值
dbms_output.put_line(rec_stu.s_name);
end loop;
--關閉游標
close cur_stu;
end;
--練習,查詢員工姓名和部門位址
declare
cursor cur_emp is
select e.ename, d.loc from emp e, dept d where e.deptno = d.deptno;
v_name emp.ename%type;
v_loc dept.loc%type;
begin
open cur_emp;
loop
fetch cur_emp
into v_name, v_loc;
exit when cur_emp%notfound;
dbms_output.put_line(v_name || '在' || v_loc || '上班');
end loop;
end;
--引數游標,定義游標時,可以給他加引數
declare
cursor cur_stu(p_age student.s_age%type) is
select * from student where s_age <= p_age;
rec_stu student%rowtype;
begin
open cur_stu(18);
loop
fetch cur_stu
into rec_stu;
exit when cur_stu%notfound;
dbms_output.put_line(rec_stu.s_name);
end loop;
close cur_stu;
end;
--使用隱式游標,不需要定義,可以獲取到最近一次操作的隱式游標
--游標名是sql
--通過4個屬性知道dml操作的結果
begin
update stu set s_name = s_name || 'a' where s_name like '%lao%';
if sql%found then
dbms_output.put_line(sql%rowcount);
else
dbms_output.put_line('沒有資料被修改');
end if;
end;
--游標for迴圈,遍歷資料最簡單的形式
--會自動開啟游標
--在迴圈定義位置自動生成記錄型別的例項
declare
cursor cur_stu is
select * from student;
begin
for stu_rec in cur_stu loop
dbms_output.put_line(stu_rec.s_name || ' ' || stu_rec.s_class);
end loop;
end;
--游標變數
--不同之處:宣告游標變數時,不與某個固定的查詢掛鉤
--在開啟游標時,才指定查詢語句
--乙個游標可以執行不同的查詢,多次使用
--由於open時要指定查詢語句,不能用游標for迴圈
declare
type cur_type is ref cursor;
cur_stu cur_type;
stu_rec student%rowtype;
emp_rec emp%rowtype;
begin
open cur_stu for
select * from student;
loop
fetch cur_stu
into stu_rec;
exit when cur_stu%notfound;
dbms_output.put_line(stu_rec.s_name || ' ' || stu_rec.s_class);
end loop;
close cur_stu;
open cur_stu for
select * from emp;
loop
fetch cur_stu
into emp_rec;
exit when cur_stu%notfound;
dbms_output.put_line(emp_rec.ename || ' ' || emp_rec.sal);
end loop;
close cur_stu;
end;
ORACLE動態游標實戰舉例
游標是資料庫程式設計中必須要熟練掌握的技術,主要實現針對資料集合,進行迴圈處理,因為sql本身只能一次性處理,所以當有稍微複雜的因為時,都在儲存過程中使用游標進行實現。靜態游標在執行前就能確定對應查詢語句,最多只是傳遞一些查詢引數而已,所以比較容易處理。動態游標是在執行前查詢sql是動態拼接的,不確...
oracle 游標使用
create or replace function errortyperead return varchar2 is result varchar2 3000 type cursor type is ref cursor tempname varchar2 100 cursor testcur i...
oracle 初識游標
游標大串燒 一 游標分類 1.靜態游標 編譯時才確定elect語句。1 隱式游標 使用者不能直接控制的靜態游標 自動開,自動取,自動關 當使用者用update,delete,insert,select 帶into 時,自動產生隱式游標。游標名字為 sql 相關屬性 found,notfound,is...