游標(biāo)
PL/SQL 的游標(biāo)是指把從數(shù)據(jù)庫中查詢出來的數(shù)據(jù)以臨時表的形式存放內(nèi)中,游標(biāo)可以對存放在內(nèi) 存中的數(shù)據(jù)進(jìn)行操作掷邦,返回一條或一組記錄,或者一條也不返回
pl/sql 中的記錄和表類型雖然可以存儲數(shù)據(jù)
游標(biāo)的基本操作:
pl/sql 包含隱士游標(biāo)和顯示游標(biāo)
1. 定義游標(biāo)
cursor cursor_name is select....
2. 打開游標(biāo)
open cursor_name;
3. 提取游標(biāo)
fetch cursor_name into variable1,variable2.....
4. 關(guān)閉游標(biāo)
close cursor_name
cursor cursor_name is select...
cursor : 游標(biāo)關(guān)鍵字
cursor_name : 游標(biāo)名稱
select.. : 建立游標(biāo)所使用的查詢語句
declare
--1.定義游標(biāo)
/*
cursor c_dept is select * from dept;
/
cursor c_dept is select deptno,dname from dept;
v_dname dept.dname% type;
v_dno dept.deptno%type;
v_dept dept%rowtype;
begin
--2. 打開游標(biāo)
open c_dept;
--3. 提取游標(biāo)
loop
/
fetch c_dept into v_dept;
dbms_output.put_line(v_dept.dname||' '||v_dept.loc);
*/
fetch c_dept into v_dno,v_dname;
dbms_output.put_line(v_dname||' '|| v_dno);
exit when c_dept%notfound;
end loop;
--4. 關(guān)閉游標(biāo)
close c_dept;
end;
游標(biāo)屬性
游標(biāo)作為一個臨時表箱沦,可以通過游標(biāo)的屬性獲取游標(biāo)的狀態(tài)
1. %isopen 屬性主要用于判斷游標(biāo)是否打開,在使用游標(biāo)的時候如果不能確定是否已打開可以判斷使用(為打開游標(biāo)不可提茸锕)
2. %found 屬性主要用于判斷游標(biāo)是否找到記錄,如果找到記錄用fetch語句提取游標(biāo)數(shù)據(jù)
3. %notfound 如果提取到數(shù)據(jù)返回false否則返回true和%found正好相反
4. %rowcount 該屬性用于返回到當(dāng)前提取的實(shí)際行數(shù)
declare
cursor emp_cursor(dno number) is select ename from emp where deptno = dno;
v_name emp.ename%type;
begin
open emp_cursor(20);
loop
fetch emp_cursor into v_name;
dbms_output.put_line(v_name);
exit when emp_cursor%notfound;
end loop ;
close emp_cursor;
dbms_output.put_line('-------------');
open emp_cursor(10);
loop
fetch emp_cursor into v_name;
dbms_output.put_line(v_name);
exit when emp_cursor%notfound;
end loop ;
close emp_cursor;
end;
參數(shù)化游標(biāo)
定義游標(biāo)后,使用后再傳參
cursor cursor_name(paramter) is select....
-- Created on 2019-09-04 by LINNE
declare
cursor emp_cursor(dno number) is select ename from emp where deptno = dno;
v_ename emp.ename%type;
begin
-- Test statements here
open emp_cursor(20);
loop
fetch emp_cursor into v_ename;
dbms_output.put_line(v_ename);
exit when emp_cursor%notfound;
end loop;
close emp_cursor;
dbms_output.put_line('---------------------------------');
open emp_cursor(10);
loop
fetch emp_cursor into v_ename;
dbms_output.put_line(v_ename);
exit when emp_cursor%notfound;
end loop;
close emp_cursor;
end;
游標(biāo)for循環(huán)
游標(biāo)for循環(huán)是在pl/sql 塊中使用游標(biāo)最簡單的方式饱普,簡化了游標(biāo)的處理,Oracle會隱含的打開游標(biāo)状共,提取游標(biāo)套耕,關(guān)閉游標(biāo)
for record in cursor_name loop
.....
end loop;
declare
cursor c_dept(dno number) is select * from dept where deptno = dno;
begin
for v_dept in c_dept(20) loop
dbms_output.put_line('第'||c_dept%rowcount||'個員工'||v_dept.dname);
end loop;
end;
隱式游標(biāo)
在執(zhí)行一個SQL語句的時候,Oracle服務(wù)器將自動創(chuàng)建一個隱式游標(biāo).隱式游標(biāo)的固定名稱 SQL,隱式游標(biāo)不需要聲明和打開.使用完也不需要關(guān)閉.
隱式游標(biāo)只能處理一行數(shù)據(jù),所以into只能給一組變量賦值!
操作游標(biāo)(游標(biāo)的刪除和修改)
存儲過程
函數(shù)
包
觸發(fā)器
序列## ##
同義詞
視圖
索引
備份和恢復(fù)
審計(jì)/數(shù)據(jù)庫的數(shù)據(jù)加密/數(shù)據(jù)加載/數(shù)據(jù)傳輸/閃回..../日志恢復(fù)..
除了可以一行一行展示select結(jié)構(gòu)外,還可以更新或刪除峡继,當(dāng)前游標(biāo)行數(shù)據(jù)冯袍,如果需 要對游標(biāo)中的行數(shù)據(jù)進(jìn)行修改或刪除,在定義游標(biāo)的時候必須攜帶for update 字句
cursor cursor_name is select .....for update
declare
cursor emp_cursor is select ename, sal ,deptno from emp for update;
v_ename emp.ename%type;
v_sal emp.sal%type;
v_deptno emp.deptno%type;
begin
open emp_cursor;
loop
fetch emp_cursor into v_ename,v_sal,v_deptno;
exit when emp_cursor%notfound;
-- dbms_output.put_line(deptno||v_ename||v_sal);
update emp set deptno = deptno+ 10 where current of emp_cursor;
end loop;
close emp_cursor;
end;
--select * from emp
declare
type emp_type is ref cursor return emp%rowtype;
v_emp emp_type;
rec_emp emp%rowtype;
begin
open v_emp for select * from emp;
loop
fetch v_emp into rec_emp;
exit when v_emp%notfound;
dbms_output.put_line(rec_emp.ename);
end loop;
close v_emp;
dbms_output.put_line('-----------------------');
open v_emp for select * from emp order by deptno;
loop
fetch v_emp into rec_emp;
exit when v_emp%notfound;
dbms_output.put_line(rec_emp.ename);
end loop;
close v_emp;
end;
</article>
0人點(diǎn)贊