???一,游標是什么?
?????????????????游標是一段私有的SQL工作區,也就是一段內存區域,用于暫時存放受SQL語句影響到的數據。通俗理解就是將受影響的數據暫時放到了一個內存區域的虛表中,而這個虛表就是游標。
????????二,作用是什么?
????????????????? 1,大家都知道數據庫中的事物可以回滾,而游標在其中起著非常重要的作用,由于對數據庫的操作我們會暫時放在游標中,只要不提交,我們就可以根據游標中內容進行回滾,在一定意義有利于數據庫的安全。
???????????????? 2,另外,在Oracle中PL/SQL只能返回單行數據,而游標彌補了這個不足。相當于ADO.NET中的Data table吧。
?????????三,類型:
??????????????? 1,隱式游標:增刪改等操作Oracle都會自動創建游標,暫時保存操作結果,也就是能夠回滾的操作都會引發游標的創建。
??????????????? 2,顯示游標:由開發人員通過程序顯式控制,用于從表中取出多行數據,并將多行數據一行一行的單獨進行處理.
?
?????????四,屬性:
屬性
注釋
%rowcount?
?受SQL影響的行數
%found
?Boolean值,是否還有數據
%notfound
Boolean值,是否已無數據
%isopen
游標是否打開
?
????當然如果我們想獲得隱式游標的屬性,通過%前邊加上SQL即可得到。例如SQL%rowcount.
?
????????五,游標簡單認識了,我們來看看游標的具體使用:
?????????? 1,先看一下簡單的使用游標四步驟:
步驟
關鍵詞
說明
1
在DECLARE中cursor
聲明游標,創建一個命名的查詢語句
2
Open
打開游標
3
Fetch
取出游標中的一條記錄裝入變量
4
Close
釋放游標
?
?
????????? 2,當然游標中可以存放一條數據,也可以存放多條數據,后者是我們用游標,前者我們通過PL/SQL語句即可完成的,這樣我們在這里就必須用到循環結構了,在Oracle數據庫中我們可以使用while…… loop……end loop , for…… loop……end loop,loop……end loop。在這里需要提出的是,for循環結構在Oracle中被簡化了,我們只需要聲明和使用即可。看下邊這個例子吧:
?
?
- declare??
- ??--定義記錄類型的變量??
- ??v_user?user%rowtype;??
- ??--1,利用cursor關鍵字聲明游標??
- ??cursor?user_cur?is??
- ????select?*?from?user;??
- begin??
- ??--2,打開游標??
- ??open?user_cur;??
- ??--3,利用fetch讀取數據??
- ??fetch?user_cur??
- ????into?v_user;??
- ??while?user_cur%found?loop??
- ????dbms_output.put_line(v_user.userName);??
- ????fetch?user_cur??
- ??????into?v_user;??
- ??end?loop;??
- ??--4,釋放游標??
- ??close?user_cur;??
- end;??
declare --定義記錄類型的變量 v_user user%rowtype; --1,利用cursor關鍵字聲明游標 cursor user_cur is select * from user; begin --2,打開游標 open user_cur; --3,利用fetch讀取數據 fetch user_cur into v_user; while user_cur%found loop dbms_output.put_line(v_user.userName); fetch user_cur into v_user; end loop; --4,釋放游標 close user_cur; end;
????????b,簡化的for結構循環:
- ??--1,利用cursor關鍵字聲明游標??
- ??cursor?user_cur?is??
- ????select?*?from?user;??
- begin??
- ??--2,直接使用,Oracle會自動打開和關閉等操作。??
- ???for?v_user?in?user_cur?loop??
- ???????dbms_output.put_line(v_user.userName);??
- ????end?loop??
- end;??
declare --1,利用cursor關鍵字聲明游標 cursor user_cur is select * from user; begin --2,直接使用,Oracle會自動打開和關閉等操作。 for v_user in user_cur loop dbms_output.put_line(v_user.userName); end loop end;
???這里就介紹這兩種的類型,loop的和這都差不多。
? ? ? ? ? 3,最后在這里再學習一下帶參數的游標,也是就和我們但參數的類是一樣的,只不過一個用在了數據庫中,一個用在了編程語言中。
declare??
- ??--定義記錄類型的變量??
- ??v_User?user%rowtype;??
- ??--1,利用cursor關鍵字聲明帶參數的游標??
- ??cursor?user_Cur(v_UserNo?number)?is??
- ????select?*?from?user?where??userNo=v_UserNo;??
- begin??
- ??--2,打開帶參數的游標,使之更加靈活?。??
- ??open?user_Cur(1012);??
- ??--3,利用fetch讀取數據??
- ??loop??
- ???????fetch?user_Cur?into?v_User;??
- ???????exit?when?user_Cur%notfound;??
- ???????dbms_output.put_line(v_user.userName);??
- ??end?loop;??
- ??--4,釋放游標??
- ??close?user_Cur;??
- end