《轉》數據庫-游標

???一,游標是什么?

?????????????????游標是一段私有的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中被簡化了,我們只需要聲明和使用即可。看下邊這個例子吧:

?

?

  1. declare??
  2. ??--定義記錄類型的變量??
  3. ??v_user?user%rowtype;??
  4. ??--1,利用cursor關鍵字聲明游標??
  5. ??cursor?user_cur?is??
  6. ????select?*?from?user;??
  7. begin??
  8. ??--2,打開游標??
  9. ??open?user_cur;??
  10. ??--3,利用fetch讀取數據??
  11. ??fetch?user_cur??
  12. ????into?v_user;??
  13. ??while?user_cur%found?loop??
  14. ????dbms_output.put_line(v_user.userName);??
  15. ????fetch?user_cur??
  16. ??????into?v_user;??
  17. ??end?loop;??
  18. ??--4,釋放游標??
  19. ??close?user_cur;??
  20. 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結構循環:

declare??

  1. ??--1,利用cursor關鍵字聲明游標??
  2. ??cursor?user_cur?is??
  3. ????select?*?from?user;??
  4. begin??
  5. ??--2,直接使用,Oracle會自動打開和關閉等操作。??
  6. ???for?v_user?in?user_cur?loop??
  7. ???????dbms_output.put_line(v_user.userName);??
  8. ????end?loop??
  9. 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??

  1. ??--定義記錄類型的變量??
  2. ??v_User?user%rowtype;??
  3. ??--1,利用cursor關鍵字聲明帶參數的游標??
  4. ??cursor?user_Cur(v_UserNo?number)?is??
  5. ????select?*?from?user?where??userNo=v_UserNo;??
  6. begin??
  7. ??--2,打開帶參數的游標,使之更加靈活?。??
  8. ??open?user_Cur(1012);??
  9. ??--3,利用fetch讀取數據??
  10. ??loop??
  11. ???????fetch?user_Cur?into?v_User;??
  12. ???????exit?when?user_Cur%notfound;??
  13. ???????dbms_output.put_line(v_user.userName);??
  14. ??end?loop;??
  15. ??--4,釋放游標??
  16. ??close?user_Cur;??
  17. end

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容