Oracle游標舉例

2021-08-14 21:40:05 字數 3301 閱讀 6119

--游標

--顯式游標

--顯式游標的使用方式

--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...