❶ sql Server2005。簡述如何利用游標處理結果集
sql server中的游標標准語句結構如下:
DECLARE Employee_Cursor CURSOR FOR
SELECT BusinessEntityID, JobTitle
FROM AdventureWorks2012.HumanResources.Employee;
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
❷ sql server中的游標
使用游標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。用SQL語言從資料庫中檢索數據後,結果放在內存的一塊區域中,且結果往往是一個含有多個記錄的集合。游標機制允許用戶在SQL
server內逐行地訪問這些記錄,按照用戶自己的意願來顯示和處理這些記錄。
❸ SQL Server 2005游標怎麼才能學好啊,我學起吃力
1. 定義游標定義
游標語句的核心是定義了一個游標標識名,並把游標標識名和一個查詢語句關聯起來。DECLARE語句用於聲明游標,它通過SELECT查詢定義游標存儲的數據集合。語句格式為:
DECLARE 游標名稱 [INSENSITIVE] [SCROLL]
CURSOR FOR select語句
[FOR{READ ONLY|UPDATE[OF 列名字表]}]
參數說明:
INSENSITIVE選項:說明所定義的游標使用SELECT語句查詢結果的拷貝,對游標的操作都基於該拷貝進行。因此,這期間對游標基本表的數據修改不能反映到游標中。這種游標也不允許通過它修改基本表的數據。
SCROLL選項:指定該游標可用所有的游標數據定位方法提取數據,游標定位方法包括PRIOR、FIRST、LAST、ABSOLUTE n 和RELATIVE n 選項。
Select語句:為標準的SELECT查詢語句,其查詢結果為游標的數據集合,構成游標數據集合的一個或多個表稱作游標的基表。
在游標聲明語句中,有下列條件之一時,系統自動把游標定義為INSENSITIVE游標:
SELECT語句中使用了DISTINCT、UNION、 GROUP BY或HAVING等關鍵字;
任一個游標基表中不存在唯一索引。
其他
READ ONLY選項:說明定義只讀游標。
UPDATE [OF 列名字表]選項:定義游標可修改的列。如果使用OF 列名字表選項,說明只允許修改所指定的列,否則,所有列均可修改。
例如,查詢教師名字和所教的課程名,定義游標TCURSOR的語句如下 :
DECLARE TCURSOR CURSOR FOR
SELECT tname, cname
FROM teacher ,couse
WHERE teacher.tno = couse.tno
2. 打開游標
打開游標語句執行游標定義中的查詢語句,查詢結果存放在游標緩沖區中。並使游標指針指向游標區中的第一個元組,作為游標的預設訪問位置。查詢結果的內容取決與查詢語句的設置和查詢條件。
打開游標的語句格式:
EXEC SQL OPEN 〈游標名〉
如果打開的游標為INSENSITIVE游標,在打開時將產生一個臨時表,將定義的游標數據集合從其基表中拷貝過來。
SQL Server中,游標打開後,可以從全局變數@@CURSOR_ROWS中讀取游標結果集合中的行數。
例1:打開前面所創建的查詢教師姓名和所教課名稱的游標。
OPEN tcursor
例2:顯示游標結果集合中數據行數
SELECT 數據行數 = @@CURSOR_ROWS
3. 讀游標區中的當前元組
讀游標區數據語句是讀取游標區中當前元組的值,並將各分量依次賦給指定的共享主變數。FETCH語句用於讀取游標中的數據,語句格式為:
FETCH [[NEXT|PRIOR|FIRST|LAST| ABSOLUTE n| RELATIVE n]
FROM ] 游標名
[INTO @變數1, @變數2, ….]
其中:
NEXT:說明讀取游標中的下一行,第一次對游標實行讀取操作時,NEXT返回結果集合中的第一行。
PRIOR、FIRST、LAST、ABSOLUTE n 和RELATIVE n 選項只適用於SCROLL游標。它們分別說明讀取游標中的上一行、第一行、最後一行、第n 行和相對於當前位置的第n 行。n 為負值時,ABSOLUTE n 和RELATIVE n 說明讀取從游標結果集合中的最後一行或當前行倒數n行的數據。
INTO子句 說明將讀取的數據存放到指定的局部變數中,每一個變數的數據類型應與游標所返回的數據類型嚴格匹配,否則將產生錯誤。
如果游標區的元組已經讀完,那麼系統狀態變數SQLSTATE的值被設為02000,意為"no tuple found"。
例如,讀取tcursor中當前位置後的第二行數據
FETCH RELATIVE 2 FROM tcursor
4. 利用游標修改數據
SQL Server中的 UPDATE語句 和 DELETE語句也支持游標操作,它們可以通過游標修改或刪除游標基表中的當前數據行。
UPDATE語句的格式為:
UPDATE table_name
SET 列名=表達式}[,…n]
WHERE CURRENT OF cursor_name
DELETE語句的格式為:
DELETE FROM table_name
WHERE CURRENT OF cursor_name
說明:
CURRENT OF cursor_name:
表示當前游標指針所指的當前行數據。CURRENT OF 只能在UPDATE和DELETE語句中使用。
注意:
o使用游標修改基表數據的前提是聲明的游標是可更新的。
o 對相應的資料庫對象(游標的基表)有修改和刪除許可權。
5. 關閉游標
關閉游標後,游標區的數據不可再讀。CLOSE語句關閉已打開的游標,之後不能對游標進行讀取等操作,但可以使用OPEN語句再次打開該游標。
CLOSE語句的格式為:
CLOSE 游標名
例如:關閉tcursor游標如下描述:
CLOSE tcursor
6 刪除游標語句
DEALLOCATE語句刪除定義游標的數據結構,刪除後不可再用。語句格式:
DEALLOCATE 游標名
例如,刪除tcursor游標
DEALLOCATE tcursor
例1,讀JS2001班的學生的學號和姓名:
#define MAX 30
EXEC SQL BEGIN DECLARE SECTION;
char TN[12], FU[20]; //定義主變數//
EXEC SQL END DECLARE SECTION;
char tarn1[30][12],tarn2[30][20]; //定義 C 變數//
. . . . . .
EXEC SQL //執行SQL語句,定義游標//
DCLARE Scursor CURSOR FOR //聲明游標Scursor//
SELECT sno,sname //查詢sno,sname//
FROM student //對student表chax 查詢//
WHERE sclass = 'JS2001'; //sclass='JS2001'的班級//
EXEC SQL OPEN Scursor ; //打開游標//
for (i=0; i<MAX; i++)
{ EXEC SQL FETCH FROM Scursor
INTO @TN, @FU; //取到宿主變數//
tarn1= TN; //賦值到C數組變數//
tarn2= FU;
}
....................
EXEC SQL CLOSE Scursor ; //關閉游標//
EXEC SQL DEALLOCATE Scursor ; //刪除游標//
例2,定義游標,使結果集包括 pubs 資料庫的 authors 表中的所有行和列。因為沒指定 SCROLL 選項,FETCH NEXT 是唯一可用的提取選項。
DECLARE authors_cursor CURSOR FOR //聲明游標authors_cursor //
SELECT * FROM authors
OPEN authors_cursor //打開游標authors_cursor //
FETCH NEXT FROM authors_cursor //讀游標authors_cursor中的一行 //
....................
例3, 定義和使用滾動游標
DECLARE tcursor SCROLL CURSOR FOR
SELECT tname, cname FROM teacher ,couse
WHERE teacher.tno = couse.tno;
OPEN tcursor;
取tcursor中當前位置向下的第二行數據
FETCH RELATIVE 2 FROM tcursor
取tcursor中最後一行數據
FETCH LAST FROM tcursor
取tcursor中當前位置向前的第4行數據
FETCH RELATIVE -4 FROM tcursor
例4 利用 @@FETCH_STATUS 控制一個 WHILE 循環中的游標活動。
DECLARE S_Cursor CURSOR FOR
SELECT sname, sno FROM student
OPEN S_Cursor
FETCH NEXT FROM S_Cursor
WHILE @@FETCH_STATUS = '000000'
BEGIN FETCH NEXT FROM S_Cursor END
CLOSE S_Cursor
DEALLOCATE S_Cursor
例5,職工普調工資,從最低工資調起,每人工資長10%,但工資總額不能超過50萬元。當調完某個職工工資後,如果工資總額達到或超過50萬元,就不再調了,另外,如果職工全部調了一遍,工資總額還沒到50萬元,也到此為止。現有職工表emp,定義了一個游標cl,游標的查詢語句取出職工號和工資值,並按增序排列。下面是程序代碼:
void addsalary()
{ EXEC SQL BEGIN DECLARE SECTION //聲明SQL變數//
char empno[8], e_sno,SQLSTATE[6];
float s_sal, e_sal;
EXEC SQL END DECLARE SECTION; //聲明SQL變數完//
EXEC SQL DECLARE cl CURSOR FOR //定義游標 cl ,對emp表的eno,sal列可以作任何操作
SELECT eno, sal
FROM emp
ORDER BY sal ASC;
EXEC SQL OPEN cl; //打開游標/
EXEC SQL SELECT SUM(sal) INTO @s_sal FROM emp; //取工資總和到s_sal
while(s_sal < 500000.00)
{
EXEC SQL FETCH FROM cl
INTO @e_sno , @e_sal; //從游標中讀出的數據放入e_sno,e_sal變數
If(SQLSTATE='02000') BREAK; //讀完記錄,退出//
EXEC SQL UPDATE emp
SET sal=sal*1.1 //游標內容更新,將empno=e_sno相應的sal*1.1
WHERE empno=@e_eno;
s_sal = s_sal+ e_sal *0.1; //計算工資總和到s_sal
};
EXEC SQL CLOSE cl; /關閉游標/}
SQL Server提供兩種游標應用介面方法:第一種是符合ANSI標準的SQL游標語句,它們可以實現聲明、打開、讀取或關閉游標操作,這些語句可用在Transact_SQL語句或存儲過程內;第二種是庫函數形式,客戶端的DB_Library 或ODBC應用程序可以調用這些函數。
游標語句增強了Transact_SQL對集合數據的處理能力,在SQL Server中,通過游標還可以修改或刪除基表中的數據。
7,使用游標時應注意的問題:
(1) 盡管使用游標比較靈活,可以實現對數據集中單行數據的直接操作,但游標會在下面幾個方面影響系統的性能:
-使用游標會導致頁鎖與表鎖的增加
-導致網路通信量的增加
-增加了伺服器處理相應指令的額外開銷
(2) 使用游標時的優化問題:
-明確指出遊標的用途:for read only或for update
-在for update後指定被修改的列
❹ SQL Server 中游標是什麼
游標(cursor)是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。每個游標區都有一個名字。用戶可以用SQL語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理。
一般是在需要對查詢的結果集中的數據再進行二次處理才會用到。
❺ 在Sql Server2005中不支持此游標類型/並發組合
因為你的
con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
導致了沖突。
參考 SQL Server 2005 的聯機叢書
INSENSITIVE
定義一個游標,以創建將由該游標使用的數據的臨時復本。對游標的所有請求都從 tempdb 中的這一臨時表中得到應答;因此,在對該游標進行提取操作時返回的數據中不反映對基表所做的修改,並且該游標不允許修改。使用 SQL-92 語法時,如果省略 INSENSITIVE,則已提交的(任何用戶)對基礎表的刪除和更新都反映在後面的提取中。
也就是你那個
ResultSet.TYPE_SCROLL_INSENSITIVE 要求是 只讀的。
但是後面的
ResultSet.CONCUR_UPDATABLE 又要求 可更新。
所以導致這個 沖突的問題。
❻ sql server 2005游標的具體使用步驟有哪些
DECLARECR_XXXCURSORFAST_FORWARDFOR--申明游標
SELECTa,b,cFROM對象表
OPENCR_XXX--打開游標
WHILE(1=1)
BEGIN
ETCHNEXTFROMCR_XXX--取得數據
INTO@wk_a,@wk_b,,@wk_c
IF@WK_FETCH_STATUS=-1BREAK--數據循環結束,退出
。。。。--具體操作
END
DEALLOCATECR_XXX--釋放游標
❼ 學習SQL SERVER2005 游標,不知道錯在哪裡,求大神點撥。。
把cursor名前面的@去掉,如下:
declare cursor_1 CURSOR for
Select PtnLimitTime from tblPlanTableName
open cursor_1
fetch next from cursor_1 into @PtnLimitTime
while(@@fetch_status=0)begin
print @PtnLimitTime
fetch next from cursor_1 into @PtnLimitTime
end
close cursor_1
deallocate cursor_1
❽ SQL Server 2005游標的使用
如果游標只向最後一行,就沒有必要用游標。
需要逐行檢索,就需要利用游標。
大致步驟你都曉得就這些
定義游標、打開游標、滾動游標、業務處理、關閉游標。
沒有具體例子也不好演示。
❾ 請問sql server資料庫中的游標怎麼理解
select 查詢完了相當於是一張表(結果集)
游標就是指向表的一條記錄的指針
你去控制指針的移動 遍歷整個表(結果集)
從而對結果做進一步的加工
❿ 求一個sqlserver2005的游標的語句
--申明一個游標
DECLARE
MyCursor
CURSOR
FOR
SELECT
TOP
5
FBookName,FBookCoding
FROM
TBookInfo
--打開一個游標
OPEN
MyCursor
--循環一個游標
DECLARE
@BookName
nvarchar(2000),@BookCoding
nvarchar(2000)
FETCH
NEXT
FROM
MyCursor
INTO
@BookName,@BookCoding
WHILE
@@FETCH_STATUS
=0
BEGIN
print
'name'+@BookName
FETCH
NEXT
FROM
MyCursor
INTO
@BookName,@BookCoding
END
--關閉游標
CLOSE
MyCursor
--釋放資源
DEALLOCATE
MyCursor
游標屬於行級操作
消耗很大
SQL查詢是基於數據集的
所以一般查詢能有
能用數據集
就用數據集
別用游標
數據量大
是性能殺手