游標是對映在結果集中一行資料上的位置實體,有了游標,使用者就可以訪問結果集中的任意一行資料了,將游標放置到某行後,即可對該行資料進行操作,例如提取當前行的資料等。
oracle 游標有4個屬性:%isopen,%found,%notfound,%rowcount。
%isopen判斷游標是否被開啟,如果開啟%isopen等於true,否則等於false;
%found %notfound判斷游標所在的行是否有效,如果有效,則%foundd等於true,否則等於false;
%rowcount返回當前位置為止游標讀取的記錄行數。oracle 游標有4個屬性:%isopen,%found,%notfound,%rowcount。
%isopen判斷游標是否被開啟,如果開啟%isopen等於true,否則等於false;
%found %notfound判斷游標所在的行是否有效,如果有效,則%foundd等於true,否則等於false;
%rowcount返回當前位置為止游標讀取的記錄行數。
游標分為顯式游標和隱式游標。
當使用顯式游標時,需要在定義顯式游標時指定相應的select語句,這種顯式游標成為靜態游標。例如:
cursor mycur(vartype number) is
select emp_no,emp_zc from cus_emp_basic
where com_no = vartype;
當使用游標變數ref cursor時,在定義游標變數時不需要指定selelct語句,而是在開啟游標時指定select語句,從而實現動態游標操作。例如:
declare
type c1 is ref cursor;
emp_cursor c1;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
open emp_cursor for
select ename,sal from emp where deptno = 10;
loop
fetch emp_cursor into v_ename,v_sal;
exit when emp_cursor%notfound;
dbms_output.put_line(v_name);
end loop;
close emp_cursor;
end;
for update子句用於在游標結果集資料上加行共享鎖,以防止其他使用者在相應行上執行dml操作;當select語句引用到多張表時,使用of子句可以確定哪些表要加鎖,如果沒有of子句,則會在select語句所引用的全部表上加鎖;nowait子句用於指定不等待鎖。在提取了游標資料之後,為了更新或刪除當前游標行資料,必須在update或delete語句中引用where current of子句。
使用顯式游標更新資料:
declare
cursor emp_cursor is
selcet ename, sal from emp for update;
v_ename emp.ename%type;
v_oldsal emp.sal%type;
begin
open emp_cursor;
loop
fetch emp_cursor into v_ename, v_oldsal;
exit when emp_cursor%notfound;
if v_oldsal<2000 then
update emp set sal=sal+100 where current of emp_cursor;
end if;
end loop;
close emp_cursor;
end;
cursor表示式用於返回巢狀游標,例:
declare
type refcursor is ref cursor;
cursor dept_cursor(no number) is
select a.dname, cursor(select ename, sal from emp
where deptno=a.deptno)
from dept a where a.deptno=no;
empcur refcursor;
v_dname dept.dname%type;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
open dept_cursor(&no);
loop
fetch dept_cursor into v_dname, empcur;
exit when dept_cursor%notfound;
dbms_output.put_line('部門名:'||v_dname);
loop
fetch empcur into v_ename, v_sal;
exit when empcur%notfound;
dbms_output.put_line('雇員名:'||v_ename||',工資:'||v_sal);
end loop;
close dept_cursor;
end;
PL SQL中的游標
為了處理 sql 語句,oracle 必須分配一片叫上下文 context area 的區域來處理所必需的資訊,其中包括要處理的行的數目,乙個指向語句被分析以後的表示形式的指標以及查詢的活動集 active set 游標是乙個指向上下文的控制代碼 handle 或指標。通過游標,pl sql可以控制...
pl sql游標 PL SQL游標 1
pl sql游標 游標 隱式游標 sql返回單行。由oracle server建立。顯式游標 sql重新調整多個記錄行。由使用者建立。游標生命週期 宣告 開啟 獲取 檢查最後一條記錄 關閉 基本語法 declare cursor cursorname param1,param2,is select ...
PL SQL中cursor 游標 游標 的用法
今天簡單的總結一下pl sql中cursor 游標 游標 的用法.相信不少做開發或維護的dba在找工作的時候,遇到過類似的面視問題 請簡單的描述一下游標的型別,說一下普通游標和ref游標之間的區別,以及什麼時候該正確應用哪乙個?這個題目,我著實難住了不少人,其實他們在具體開發的時候,也還是比較能夠把...