Oracle pl/sql編程之游標操作
來源:程序員人生 發布時間:2016-04-12 10:28:10 閱讀次數:3679次
在通過select語句查詢是,返回的結果通常是多行記錄組成的集合。為此SQL提供了游標機制。游標可以充當指針的作用,使利用程序設計語言1次只能處理查詢記過中的1行。在Oracle中,可使用隱式和顯示兩種游標。在pl/sql中程序所有發出的DML和select語句,Oracle都會自動聲明“隱式游標”。為了處理由select語句返回的1組記錄,需要在pl/sql程序中申明和處理“顯示游標”。
隱式游標
游標的主要屬性以下:
%found 布爾型屬性,如果SQL語句最少影響1行,則為true,否則為false
%notfound 布爾型屬性,與%found相反
%isopen 布爾型屬性,當游標已打開時返回true,游標關閉為false
%rowcount 數字型屬性,返回受sql語句影響的行數
如果履行了1個select語句則可以通過SQL%ROWCONT來檢查受影響的行數,還可以通過SQL%FOUND屬性值是不是為true,以檢查SQL語句是不是影響到了任何行。
begin
update emp set sal=850 where ename=SMITH;
if sql%notfound then
dbms_output.put_line(未更行任何記錄);
else
dbms_output.put_line(更新記錄||sql%rowcount||條);
end if;
end;
在使用游標的屬性值時,需要注意1個重要的事項。游標的屬性信息總是反應最新的SQL語句處理結果。因此,當在1個程序塊中出現多個sql語句時,需要斟酌在何處檢查屬性值
declare
emp_row emp%rowtype;
begin
update emp set sal=1800 where ename=SMITH;
dbms_output.put_line(更新||sql%rowcount||條記錄);
select * into emp_row from emp where ename=SMITH;
dbms_output.put_line(檢索到||sql%rowcount||條記錄);
end;
另外一種情勢的隱式游標是cursor for loop,可以用于處理sql返回的結果集。
begin
for empcursor in(select * from emp)
loop
dbms_output.put_line(姓名:||empcursor.ename);
end loop;
end;
顯示游標
顯示游標是在pl/sql程序中使用包括select語句來聲明的游標。如果需要處理從數據庫中檢索的1組記錄,則可使用顯示游標。使用顯示游標處理數據需要4個PL/SQL步驟
聲明游標,打開游標,檢索數據和關閉游標
聲明游標
CURSOR 游標名[(參數1 數據類型[參數2 數據類型...])]
IS SELECT語句;
declare
cursor emp_cursor(v_name in varchar2 default SMITH)
is select * from emp where ename=v_name;
以上代碼定義1個名為emp_cursor的游標,并為其規定了輸入參數為‘v_name’,該參數為1個字符串數據類型,其默許值為‘SMITH
打開和關閉游標
打開游標就是履行聲明游標所指定的查詢語句。游標必須聲明后才能打開,打開游標也就是調用游標中的select語句。打開游標的進程非常簡單,只需要使用關鍵字OPEN并指定打開的游標名及傳遞的參數值
open 游標名[(參數1 數據類型[參數2 數據類型...])];
例如,要打開上面聲明的游標emp_cursor,可使用以下代碼:
open emp_cursor;
如果履行該語句,其輸入的參數就是默許值,將會把SMITH的信息查詢出來,如果要查KING
的信息
open emp_cursor(KING );
關閉游標使得用戶不能再從查詢結果中檢索數據。使用完游標后應當馬上關閉游標,釋放select查詢結果。如果關閉上面定義的游標emp_cursor,可使用以下語句:
close emp_cursor;
檢索數據
檢索數據就是從檢索到的結果集中獲得數據保存到變量中,以遍在程序中進行處理。這4個操作步驟在程序中是順次進行的,即只有先聲明游標才能打開,1旦打開游標就可以從獲得數據,當不需要數據時就關閉游標
游標聲明中的select語句返回1組數據,open語句履行了select語句,close語句釋放select語句的查詢結果。而這1切工作都是為了從檢索數據
檢索數據使用fetch語句找出結果集中的單行,并從中提取單個值傳給主變量語法以下:
fetch cursor_name into {variable_list|recod_variable};
列子:
declare
cursor emp_cursor(v_deptno in number)
is select * from emp where deptno=v_deptno;
type cursor_result is record(
cursor_result_empno emp.empno%type,
cursor_result_ename emp.ename%type,
cursor_result_job emp.job%type,
cursor_result_mgr emp.mgr%type,
cursor_result_hiredate emp.hiredate%type,
cursor_result_sal emp.sal%type,
cursor_result_comm emp.comm%type,
cursor_result_deptno emp.deptno%type
);
v_cursor_result cursor_result;
begin
open emp_cursor(10);
LOOP
FETCH emp_cursor into v_cursor_result;
exit when emp_cursor%notfound;
dbms_output.put_line(v_cursor_result.cursor_result_empno);
dbms_output.put_line(v_cursor_result.cursor_result_ename);
dbms_output.put_line(v_cursor_result.cursor_result_job);
dbms_output.put_line(v_cursor_result.cursor_result_mgr);
dbms_output.put_line(v_cursor_result.cursor_result_hiredate);
dbms_output.put_line(v_cursor_result.cursor_result_sal);
dbms_output.put_line(v_cursor_result.cursor_result_comm);
dbms_output.put_line(v_cursor_result.cursor_result_deptno);
dbms_output.put_line(========================================);
end loop;
close emp_cursor;
end;
游標for循環
在pl/sql中還有1種更加方便的使用顯示游標的方法,那就是游標for循環,游標for循環是顯示游標的1種快捷方式,它使用for循環順次讀取結果集中的行數據,當for循環開始時游標自動打開(不需要使用open方法)每循環順次,系統自動讀取游標當前行的數據(不需要使用FETCH),當退出for循環時,游標自動關閉(不需要使用close)
declare
cursor emp_cursor(v_deptno in number default 10)
is select * from emp where deptno=v_deptno;
begin
for r in emp_cursor loop
dbms_output.put_line(r.empno);
dbms_output.put_line(r.ename);
dbms_output.put_line(r.job);
dbms_output.put_line(r.mgr);
dbms_output.put_line(r.hiredate);
dbms_output.put_line(r.sal);
dbms_output.put_line(r.comm);
dbms_output.put_line(r.deptno);
dbms_output.put_line(========================================);
end loop;
end;
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈