ORACLE靜態游標

2021-06-27 20:38:22 字數 3592 閱讀 4073

游標(cursor)是系統為使用者開設的乙個

資料緩衝區

,存放sql語句的執行結果。每個游標區都有乙個名字。使用者可以用sql語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理。

游標,從declare、open、fetch、close是乙個完整過程。

以下sql語句均在oracle中的scott使用者下執行並通過測試。

一、定義游標的幾種方式。

1.指向固定結果集的游標

declare

cursor c_emp  is  select * from emp;

begin

open c_emp;

--操作語句

close c_emp;

end;

/2.定義用變數控制結果集的游標。

declare

v_sal 

number(7,2);

cursor c_emp is select * from emp where sal>v_sal;

begin

v_sal:= 3000;

open c_emp;

--操作語句

close c_emp;

end;

/3.第三種游標的定義方式,帶引數的游標,用的最多,與2有異曲同工之妙。

--指定引數型別時如果是number或varchar2的話不需要定義長度,否則編譯不會通過。

declare

cursor c_emp(v_sal number) is select * from emp where sal>v_sal;

begin

open c_emp(3000);

--操作語句

close c_emp;

end;

/二、游標的使用

宣告游標之後,通過開啟游標就可以取結果集,可以定義乙個變數用於儲存游標取出的單個記錄或資料。

--取單個字段情況:

set serveroutput on;

declare

v_name 

emp.ename%type;--定義乙個與emp.name相同型別的變數。

cursor c_name  is  select 

ename  from emp;

begin

open c_name;

fetch c_name  into v_name;

dbms_output.put_line(v_name);

--輸出員工姓名。

close c_name;

end;/

--取整個記錄情況:

set serveroutput on;

declare

v_emp 

emp%rowtype;--定義乙個與emp相同的記錄型別的變數。

cursor c_emp  is  select * from emp;

begin

open c_emp;

fetch c_emp into v_emp;

dbms_output.put_line(v_emp.empno||v_emp.ename||v_emp.sal);

-- 輸出員工編號,姓名和工資。

close c_emp;

end; /

注:也可以在取整個記錄的游標中定義乙個你要取的字段的相同型別的變數比如

v_name 

emp.ename%type

然後令v_name:=v_emp.ename,也達到了取單個欄位的目的(當然其他資料就浪費了)。

如果要取多個字段(empno,ename),可以定義乙個物件型別,包含要取的字段的變數。如:

type emp_record_type  is record(

emp_no

emp.empno%type,

e_name 

emp.ename%type

); emp_rec  emp_record_type;

取游標:

fetch c_emp into emp_rec.emp_no,emp_rec.e_name;

不能採用如下方式取單個字段:

fetch c_emp into v_name;--『列表中值數量出現錯誤』

fetch c_emp.ename into v_name;--『子程式或游標 'c_emp' 引用超出範圍』 三、

如何用游標遍歷整個結果集

在這之前先講一下游標的四個屬性:  %found,%notfound,%isopen,%rowcount。

%found:若fetch語句返回了一行資料,則%found返回true。

%notfound:若fetch語句未找到資料,則%notfound返回true。

%isopen,判斷游標是否開啟。

%rowcount:當前游標的指標位移量,到目前位置游標所檢索的記錄的行數。

遍歷的過程其實類似於迴圈語句,所以遍歷也有for,while,loop等幾種方式:

--loop方式遍歷游標

declare

v_name  varchar2(10);

cursor c_name  is  select ename from emp;

begin

open  c_name;

loop

fetch c_name into v_name;

exit when c_name%notfound;--未找到資料時退出(即到達記錄末尾)。

dbms_output.put_line(v_name);

end loop;

close c_name;

end;

/

--while迴圈遍歷

declare

v_name 

varchar2(10);

cursor c_name  is  select ename from emp;

begin

open  c_name;

fetch c_name into v_name;

while c_name%found--能找到資料則執行迴圈內語句。

loop

dbms_output.put_line(v_name);

fetch  c_name  into v_name;

end loop;

close c_name;

end;

/

--for迴圈遍歷,最簡單,用的最多,不需要宣告v_student,open和close游標和fetch操作(不用開啟游標和關閉游標,實現遍歷游標最高效方式)。具體效能比較請參看我的部落格。

declare

cursor c_name is select ename from emp;

begin

for cur in c_name--cur是固定自帶的。

loop

dbms_output.put_line(cur.ename);

end loop;

end;

/

oracle04 靜態游標,動態游標

3 使用帶引數的靜態游標查詢某工資區間的員工資訊 最高工資,最低工資是引數 declare va emp emp rowtype va min emp.sal type 最低工資 va max emp.sal type 最高工資 cursor va empcur va mingsal emp.sal...

oralce 動態游標和靜態游標結合

create or replace procedure sgcm work plan history is type ref cursor type is ref cursor 定義乙個動態游標 usrs ref cursor type str classify id varchar2 250 類別...

oracle 游標使用

create or replace function errortyperead return varchar2 is result varchar2 3000 type cursor type is ref cursor tempname varchar2 100 cursor testcur i...