游標(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...