Oracle資料庫開發必備利器之PL/SQL基礎——遊標
阿新 • • 發佈:2018-12-24
遊標
遊標:就是一個結果集
CURSOR 游標名[(引數名 資料型別[,引數名 資料型別]...)]
IS SELECT 語句;
例如 cursor c1 is select ename from emp;
從遊標中取值
1.開啟遊標:
open c1;
開啟游標執行查詢
2.關閉遊標:
close c1;
關閉遊標釋放資源
3.取一行游標的值:
fetch c1 into pename;
取一行到變數中
fetch的作用:
1)把當前指標指向的記錄返回
2)將指標指向下一條記錄
例子:查詢並列印員工的姓名和薪水
/*
1、遊標的屬性
%found %notfound
*/
set serveroutput on
declare
--定義一個遊標
cursor cemp is select ename,sal from emp;
--為遊標定義變數
pename emp.ename%type;
psal emp.sal%type;
begin
--開啟遊標
open cemp;
loop
--取一條記錄
fetch cemp into pename,psal;
-- 思考:1.迴圈什麼時候退出?2.fetch不一定能取到記錄
-- exit when 沒有取到記錄
--沒有取到記錄迴圈退出
exit when cemp%notfound;
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
--關閉遊標
close cemp;
end;
/
例子:給員工漲工資
set serveroutput on
declare
-- 定義遊標代表給哪些員工漲公司
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pempjob emp.empjob%type;
begin
--rollback;
--開啟遊標
open cemp;
loop
--取出員工
fetch cemp into pempno,pempjob;
exit when cemp%notfound;
-- 判斷員工的職位
if pempjob = 'PRESIDENT' then update emp set sal=sal-2000 where empno=pempno;
elsif pempjob = 'MANAGER' then update emp set sal=sal-1600 where empno=pempno;
else update emp set sal=sal-800 where empno=pempno;
end if;
end loop;
--對於oracle,預設的事務隔離級別是read committed
-- 事務的ACID:原子性,一致性,隔離性,永續性
commit;
dbms_output.put_line('漲工資完成');
--關閉遊標
close cemp;
end;
遊標的屬性
%found %notfound
%isopen; 判斷遊標是否開啟 true / false
%rowcount; 影響的行數
set serveroutput on
declare
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
begin
open cemp;
if cemp%isopen then dbms_output.put_line('遊標已經開啟');
else dbms_output.put_line('遊標沒有開啟');
end if;
loop
fetch cemp into pempno,pjob;
exit when cemp%nofound;
dbms_output.put_line('rowcount:'||cemp%rowcount);
end loop;
close cemp;
end;
/
遊標數的限制
預設情況下,Oracle資料庫只允許在同一個回話中,開啟300個遊標
檢視預設遊標數:
解釋:
-- 切換到管理員
show user
conn sys/[email protected]192.168.56.101:1521/orcl as sysdba
show parameter -- 做的是模糊查詢
show parameter cursor
-- 修改遊標數的限制
alter system set open_cursors=400 scope=both;
scope的取值:both、memory(只更改當前例項,不更改引數檔案)、spfile(只更改引數檔案,不更改當前例項,資料庫需要重啟才會生效)
帶引數的遊標
帶引數的游標 : 定義的時候宣告這個形參,然後在開啟游標的是傳個實參進入。