時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
游標是構(gòu)建在PL/SQL中,用來查詢數(shù)據(jù),獲取記錄集的指針。它讓開發(fā)者 一次訪問結(jié)果集中一行記錄。
在oracle中提供了兩種游標: 1 靜態(tài)游標 2 ref游標
靜態(tài)游標:靜態(tài)游標是在編譯的時候就被確定。然后把結(jié)果集復制到內(nèi)存中 靜態(tài)游標又分為兩種:隱式游標和顯示游標。
ref游標:ref游標是在運行的時候加載結(jié)果集
先來看看靜態(tài)游標中的隱式游標
在PL/SQL中為所有的SQL數(shù)據(jù)操縱語句(包括返回一行的select)隱式聲明游標 稱為隱式游標。主要原因是用戶不能直接命名和控制此類游標。當用戶在PL/SQL 中使用數(shù)據(jù)操縱語句(DML)時,oracle預先定義一個名稱為SQL的隱式游標,通過 檢查隱式游標的屬性獲取與最近執(zhí)行的SQL語句相關信息。 在執(zhí)行DML語句之后,隱式游標屬性返回信息。隱式游標屬性包括: %found %notfound %rowcount %isopen 1 %found 只有DML語句影響一行或多行時,%found屬性才返回true declare num number; begin update emp set empno=123 where empno=111; if sql%found then dbms_output.put_line('存在記錄'); else dbms_output.put_line('不存在記錄'); end if; end; 2 %notfound %notfound屬性作用正好跟%found屬性相反。如果DML語句沒有影響任何行數(shù) ,則%notfound屬性返回true. declare begin delete from emp where empno=111; if sql%notfound then dbms_output.put_line('刪除失敗'); end if; end; 3 %rowcount %rowcount屬性返回DML語句影響的行數(shù)。如果DML語句沒有影響任何行數(shù) ,則%rowcount屬性將返回0。 declare num number; begin update emp set empno=123 where empno=111; if sql%rowcount=0 then dbms_output.put_line('不存在記錄'); else dbms_output.put_line('存在記錄'); end if; end; 4 %isopen %isopen屬性判斷SQL游標是否已經(jīng)打開。在執(zhí)行SQL語句之后,oracle自動關閉SQL 游標,所以隱式游標的%isopen屬性始終為false. 在PL/SQL中向標準的select語句增加單獨的into子句,就可以將從表或視圖中查詢的記錄賦予變量或行變量。需要注意的是select ..into 語句結(jié)果必須有且只能有一行。 如果查詢沒有返回行,PL/SQL將拋出no_data_found異常。如果查詢返回多行,則拋出 too_many_rows 異常。如果拋出異常,則停止執(zhí)行,控制權(quán)轉(zhuǎn)移到異常處理部分(沒有 異常處理,則程序中斷)。在引發(fā)異常時,將不使用屬性%found,%notfound,%rowcount來查明DML語句是否 已影響了行數(shù)。 declare num number; begin select empno into num from emp where empno=111; if sql%rowcount=0 or sql%notfound then dbms_output.put_line('不存在記錄'); else dbms_output.put_line('存在記錄'); end if; end;
---------------------------------------------
顯示游標 顯示游標是由用戶顯示聲明的游標。根據(jù)在游標中定義的查詢,查詢返回的行集合可以 包含零行或多行,這些行稱為活動集。游標將指向活動集中的當前行。 顯示游標的操作過程。使用顯示游標的4個步驟: (1)聲明游標 (2)打開游標 (3)從游標中獲取結(jié)果集 (4)關閉游標 cursor cursor_name [(parameter[,parameter])] [return return_type] is select_statement; cursor_name 指游標的名稱。 parameter?? 為游標指定輸入?yún)?shù)。 return_type 定義游標提取行的行類型。 select_statement 為游標定義查詢語句。 open 游標名稱 fetch 從游標中提取行 close 關閉游標
1 打開游標,執(zhí)行游標中定義的查詢語句,綁定輸入?yún)?shù),將游標指針指 向結(jié)果集的BOF位置。 open cursor_name [parameters]
2?? fetch 在打開游標之后,可以從游標中提取記錄 fetch cursor_name into variable_name; fetch 是提取結(jié)果集中一行記錄存儲在變量中。每次提取之后,結(jié)果集指針 就向前移動一行。
3 close 在處理游標中的所有行之后,必須關閉游標,以釋放分配給游標的所有資源。 close cursor_name 用戶可以通過檢查游標屬性來確定游標的當前狀態(tài)。
顯示游標的屬性如下: %found:如果執(zhí)行最后一條fetch語句,成功返回行,則%found屬性為true。 %notfound:如果執(zhí)行最后一條fetch語句,未能提取行,則%notfound屬性為true。 %isopen:如果游標已經(jīng)打開,則返回true,否則返回false。 %rowcount:返回到目前為止游標提取的行數(shù)。%rowcount為數(shù)字類型屬性。在第一 次獲取之前,%rowcount為零。當fetch語句返回一行時,則該數(shù)加1。
declare info emp%rowtype; cursor my_cur is select * from emp where empno=111; begin open my_cur; dbms_output.put_line(my_cur%rowcount); loop if my_cur%isopen then fetch my_cur into info; exit when my_cur%notfound; dbms_output.put_line(info.empno); dbms_output.put_line(my_cur%rowcount); end if; end loop; close my_cur; end;
---------------------------------------------------
使用顯示游標刪除或更新 使用游標時,如果處理過程中需要刪除或更新。在定義游標查詢語句時 必須使用select..for update語句,而在執(zhí)行delete或update時使用 where current of 子句指定游標當前行。 cursor cursor_name is select_statement for update[of column] wait/nowait 在使用for update 子句聲明游標之后,可以使用以下語法更新行 update table_name set column_name=column_value where current of cursor_name; update命令中使用的列必須出現(xiàn)在for update of 子句中 select 語句必須只包括一個表,而且delete和update語句只有在打開游標并且提取 特定行之后才能使用。
declare cursor cur_emp is select * from emp where sal<2000 for update of sal; num emp%rowtype; begin open cur_emp; loop fetch cur_emp into num; exit when cur_emp%notfound; update emp set sal=2000 where current of cur_emp; end loop; close cur_emp; end;
---------------------------------------------------------------------------------------------------------------
帶參數(shù)的顯示游標 PL/SQL中允許顯示游標接受輸入?yún)?shù)。用于聲明帶參數(shù)的顯示游標語法 cursor cursor_name[
可以使用循環(huán)游標來簡化顯示游標。
循環(huán)游標隱式打開顯示游標(不需要open) 自動從結(jié)果集提取記錄,然后處理完所有記錄自動關閉游標。循環(huán)游標自動創(chuàng)建 %rowtype類型的變量并將此變量用做記錄的索引。 循環(huán)游標語法如下: for record_index in cursor_name record_index是PL/SQL自動創(chuàng)建的變量,此變量的屬性聲明為%rowtype類型。作用 域for循環(huán)之內(nèi)。
循環(huán)游標的特性有: 從游標中提取所有記錄之后自動關閉游標。
提取和處理游標中每一條記錄 提取記錄之后%notfound屬性為true則退出循環(huán)。如果未有結(jié)果集,則不進入循環(huán)。 declare cursor emp_cur is select * from emp; begin for temp in emp_cur loop dbms_output.put_line(temp.ename); end loop; end; 循環(huán)游標自動打開,提取,關閉。只適用于靜態(tài)游標
關鍵詞標簽:oracle,靜態(tài)游標
相關閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實例的控制文件 為UNIX服務器設置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法