PL SQL中的游標

2021-04-25 15:53:32 字數 2614 閱讀 8377

游標是對映在結果集中一行資料上的位置實體,有了游標,使用者就可以訪問結果集中的任意一行資料了,將游標放置到某行後,即可對該行資料進行操作,例如提取當前行的資料等。

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游標之間的區別,以及什麼時候該正確應用哪乙個?這個題目,我著實難住了不少人,其實他們在具體開發的時候,也還是比較能夠把...