在資料庫開發過程中,我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?
我們知道sql server 並沒有提供單一記錄的表達形式,除非使用where限制一條語句,因此需要借助游標來進行面向單條記錄的資料處理。
游標提供了一種對從表中檢索出的資料進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條資料記錄的結果集中每次提取一條記錄的機制。由此可見,游標允許應用程式對查詢語詢select返回的行結果集中每行進行相同或不同的操作,而不是一次對整個結果集進行同-種操作;它還提供對基於游標位置而對錶中資料進行刪除或更新的能力;而且,正是游標把作為面向集合的資料庫管理系統和面向行的程式設計兩者聯絡起來,使兩個資料處理方式能夠進行溝通。
使用游標的基本操作步驟:宣告游標、開啟游標、提取資料、關閉游標。
1、宣告游標
游標的宣告包括兩個部分:游標的名稱、游標用到的select語句。
eg.
declare custcursor cursor for
select cus_no,name,
yue --餘額
from customer
注意點:如同其它變數宣告一樣,游標宣告是不執行的,不能將斷點設在這一行**上,也不能宣告兩個同名的游標,即便是用if…end if語句。
2、開啟游標
宣告游標後在做其它操作時必須先開啟它,開啟游標實際與其相關的sql語句,開啟游標**:
open custcursor ;
3、提取資料
當用 open 語句開啟了游標並在資料庫中執行了查詢後,您不能立即利用在查詢結果集中的資料。您必須用 fetch 語句來取得資料。一條 fetch 語句一次可以將一條記錄放入程式設計師指定的變數中。事實上,fetch 語句是游標使用的核心。使用游標,我們只能逐條記錄地得到查詢結果。
已經宣告並開啟乙個游標後,我們就可以將資料放入任意的變數中。在 fetch 語句中您可以指定游標的名稱和目標變數的名稱。如下例:
fetch custcursor -sor into:
ls_cus_no, :ls_name, :ll_yue;
從語法上講,上面所述的就是一條合法的取資料的語句,但是一般我們使用游標卻還應當包括其它的部分。正如我們前面所談到的,游標只能一次從後台資料庫中取一條記錄,而在多數情況下,我們所想要作的是在資料庫中從第一條記錄開始提取,一直到結束。所以我們一般要將游標提取資料的語句放在乙個迴圈體內,直至將結果集中的全部資料提取後,跳出迴圈圈。通過檢測 sqlca.sql-code 的值,可以得知最後一條 fetch 語句是否成功。一般,當 sqlcode值為 0 時表明一切正常,100 表示已經取到了結果集的末尾,而其它值均表明操作出了問題,這樣我們可以編寫以下的**:
lb_continue=true
ll_total=0
do while lb_continue
fetch custcursor -sor intols_cus_no, :ls_name, :ll_yue;
if sqlca.sqlcode=0
then
ll_total+=ll_balance
else lb_continue=false
end if
loop
4、關閉游標
在游標操作的最後請不要忘記關閉游標,這是乙個好的程式設計習慣,以使系統釋放游標占用的資源。關閉游標的語句很簡單:
close custcursor ;
游標的型別 同其它變數一樣,我們也可以定義游標的訪問型別:全域性、共享、例項或區域性,游標變數的命名規範建議也同其它變數一樣。
宣告游標
declare my_cursor cursor keyset for select * from info
刪除游標資源
deallocate my_cursor`
開啟游標,在游標關閉或刪除前都有效
open my_cursor
關閉游標
close my_cursor
宣告區域性變數
declare @id int,@name varchar(20),@address varchar(20)
定位到指定位置的記錄
fetch absolute 56488 from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address
定位到當前記錄相對位置記錄
fetch relative -88 from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address
定位到當前記錄前一條
fetch prior from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address
定位到當前記錄後一條
fetch next from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address
定位到首記錄
fetch first from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address
定位到尾記錄
fetch last from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address
例項:
declare my_cursor cursor scroll dynamic
/*scroll 表示可隨意移動游標指標(否則只能向前),dynamic 表示可以讀寫游標(否則游標唯讀)*/
for select productname from product
open my_cursor
declare @pname sysname
fetch next
SQL游標原理和使用方法
在 資料庫開發過程中,當你檢索的資料只是一條記錄時,你所編寫的事務語句 往往使用select insert 語句。但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。1.1 游標和游標的優點 在資料庫中,游標是乙個十分重要的...
SQL游標原理和使用方法
在資料庫開發過程中,當你檢索的資料只是一條記錄時,你所編寫的事務語句 往往使用select insert 語句。但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。1.1 游標和游標的優點 在資料庫中,游標是乙個十分重要的概...
SQL游標原理和使用方法
在資料庫開發過程中,當你檢索的資料只是一條記錄時,你所編寫的事務語句 往往使用select insert 語句。但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。1.1 游標和游標的優點 在資料庫中,游標是乙個十分重要的概...