以前也接觸過遊标,但是打心裡說不是太了解,通過這次學習感覺了解深刻了很多,特此總結學習一下。
一,遊标是什麼?
遊标是一段私有的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中被簡化了,我們隻需要聲明和使用即可。看下邊這個例子吧:
a,whlie循環結構的:
[sql] view plain copy
- 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結構循環:
[sql] view plain copy
- 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,最後在這裡再學習一下帶參數的遊标,也是就和我們但參數的類是一樣的,隻不過一個用在了資料庫中,一個用在了程式設計語言中。
[sql] view plain copy
- 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;
綜上為遊标的簡單學習,回想過去的學習,可以發現遊标可以和datatable很相似,為了增加靈活性,它和類也有非常相似的功能。是以米老師曾經告訴我們的語言是相通的,每一種事也是相同的。就例如,JAVA和.NET開發,SQL Server和Oracle一樣,學通了一門,其它的轉向都是非常快的。