1. 程式人生 > >Oracle資料庫開發必備利器之PL/SQL基礎——遊標

Oracle資料庫開發必備利器之PL/SQL基礎——遊標

遊標

遊標:就是一個結果集

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(只更改引數檔案,不更改當前例項,資料庫需要重啟才會生效)

帶引數的遊標

帶引數的游標 : 定義的時候宣告這個形參,然後在開啟游標的是傳個實參進入。

這裡寫圖片描述

這裡寫圖片描述