sqlserver游標概念與實例全面解說

引言
?我們先不講游標的什么概念,步驟及語法,先來看一個例子:

????? ?????

?????? 表一 OriginSalary??????????????????????????????????????????????????? 表二 AddSalary

?

現在有2張表,一張是OriginSalary表--工資表,有三個字段0_ID 員工號(NVARCHAR)、O_Name員工姓名(NVARCHAR)、O_Salary工資(FLOAT)。
另一張表AddSalary表—加薪表。有2個字段,O_ID員工號、A_Salary增加工資。兩張表的O_ID是一一對應的,現在求將加薪的工資+原來的工資=現在的工資,也就是O_Salary=O_Salary+A_Salary,修改表OriginSalary的工資字段。
對于一些不熟悉游標的程序員來說,這個并不是什么很難的問題,這個問題用程序來實現可能也很簡單。我先說說,用ASP.NET程序解決這個問題的思路:
1.?????? 先獲得表OriginSalary的記錄數,寫個循環。
2.?????? 寫SQL語句“select * from dbo.OriginSalary as A left join dbo.AddSalary as B on A.O_ID=B.O_ID”獲得視圖。
3.?????? 使用Dataset獲得O_Salary=O_Salary+A_Salary。
4.?????? 寫UPDATE語句“update OriginSalary set O_Salary=”相加的值” where O_ID=”獲得值”
5.?????? 循環3次,完成此功能。
還有一種方法就是寫存儲過程,在這里我就不列出來了。
我想大家在學習游標之前好好想想這個問題,及一些批量處理的例子。可能有的人會說:“難道數據庫不能一行一行的處理數據嗎?將表AddSalary的數據逐行的取出,然后表 OriginSalary數據逐行的修改?”答案當然是肯定。這就是游標概念。接下來的一章我們會好好的講講什么是游標?我會用游標來解決剛才留給大家的問題。
?
1.1游標的概念
?游標(Cursor)它使用戶可逐行訪問由SQL Server返回的結果集。使用游標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。用SQL語言從數據庫中檢索數據后,結果放在內存的一塊區域中,且結果往往是一個含有多個記錄的集合。游標機制允許用戶在SQL server內逐行地訪問這些記錄,按照用戶自己的意愿來顯示和處理這些記錄。
1.2 游標的優點
從游標定義可以得到游標的如下優點,這些優點使游標在實際應用中發揮了重要作用:
? 1)允許程序對由查詢語句select返回的行集合中的每一行執行相同或不同的操作,而不是對整個行集合執行同一個操作。
? 2)提供對基于游標位置的表中的行進行刪除和更新的能力。
? 3)游標實際上作為面向集合的數據庫管理系統(RDBMS)和面向行的程序設計之間的橋梁,使這兩種處理方式通過游標溝通起來。
1.3 游標的使用
?講了這個多游標的優點,現在我們就親自來揭開游標的神秘的面紗。
?使用游標的順序: 聲名游標、打開游標、讀取數據、關閉游標、刪除游標。
1.3.1聲明游標
最簡單游標聲明:DECLARE <游標名>CURSOR FOR<SELECT語句>;
其中select語句可以是簡單查詢,也可以是復雜的接連查詢和嵌套查詢
例子:[已表2 AddSalary為例子]
Declare mycursor cursor for select * from AddSalary
這樣我就對表AddSalary申明了一個游標mycursor
?
【高級備注】
DECLARE <游標名> [INSENSITIVE] [SCROLL] CURSORFOR<SELECT語句>
這里我說一下游標中級應用中的[INSENSITIVE]和[SCROLL]
INSENSITIVE
表明MS SQL SERVER 會將游標定義所選取出來的數據記錄存放在一臨時表內(建立在tempdb 數據庫下)。對該游標的讀取操作皆由臨時表來應答。因此,對基本表的修改并不影響游標提取的數據,即游標不會隨著基本表內容的改變而改變,同時也無法通過游標來更新基本表。如果不使用該保留字,那么對基本表的更新、刪除都會反映到游標中。
另外應該指出,當遇到以下情況發生時,游標將自動設定INSENSITIVE 選項。
a.在SELECT 語句中使用DISTINCT、 GROUP BY、 HAVING UNION 語句;
b.使用OUTER JOIN;
c.所選取的任意表沒有索引;
d.將實數值當作選取的列。
SCROLL
表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用該保留字,那么只能進行NEXT 提取操作。由此可見,SCROLL 極大地增加了提取數據的靈活性,可以隨意讀取結果集中的任一行數據記錄,而不必關閉再
重開游標。
?
1.3.2 打開游標
非常簡單,我們就打開剛才我們聲明的游標mycursor
OPEN mycursor
?
1.3.3讀取數據
FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游標名? | @游標變量名 } [ INTO @變量名 [,…] ]
參數說明:
NEXT?? 取下一行的數據,并把下一行作為當前行(遞增)。由于打開游標后,行指針是指向該游標第1行之前,所以第一次執行FETCH NEXT操作將取得游標集中的第1行數據。NEXT為默認的游標提取選項。
INTO @變量名[,…]? 把提取操作的列數據放到局部變量中。列表中的各個變量從左到右與游標結果集中的相應列相關聯。各變量的數據類型必須與相應的結果列的數據類型匹配或是結果列數據類型所支持的隱性轉換。變量的數目必須與游標選擇列表中的列的數目一致。
?
現在我們就取出mycursor游標的數據吧!
?
當游標被打開時,行指針將指向該游標集第1行之前,如果要讀取游標集中的第1行數據,必須移動行指針使其指向第1行。就本例而言,可以使用下列操作讀取第1行數據:
Eg: Fetch next from mycursor 或則 Fetch first from mycursor
這樣我就取出了游標里的數據,但是光光這樣可不夠,我們還需要將取出的數據賦給變量
//聲明2個變量
declare @O_ID NVARCHAR(20)
declare @A_Salary float
//將取出的值傳入剛才聲明的2個變量
Fetch next from mycursor into @ O_ID,@ A_Salary
?
1.3.4關閉游標
CLOSE mycursor???
?????????
1.3.5刪除游標
DEALLOCATE mycursor?????????
?
1.3.6 實例訓練
如上我介紹完了游標使用的5個步驟,那現在我們就來上上手,練習用游標取出表2 AddSalary的數據。
為了運行我們自己創建的游標,我們將游標寫在存儲過程里,方便我們看到游標的整個使用過程。
在sqlserver2000中新建一個存儲過程:
CREATE PROCEDURE PK_Test
AS
//聲明2個變量
declare @O_ID nvarchar(20)??
declare @A_Salary float
?
//聲明一個游標mycursor,select語句中參數的個數必須要和從游標取出的變量名相同
declare mycursor cursor for select O_ID,A_Salary from AddSalary
?
//打開游標
open mycursor
?
//從游標里取出數據賦值到我們剛才聲明的2個變量中
fetch next from mycursor into @O_ID,@A_Salary
?
//判斷游標的狀態
//0 fetch語句成功????
//-1 fetch語句失敗或此行不在結果集中????
//-2被提取的行不存在
while (@@fetch_status=0)
begin
?
//顯示出我們每次用游標取出的值
?? print '游標成功取出一條數據'
?? print @O_ID
?? print @A_Salary
?
//用游標去取下一條記錄
?? fetch next from mycursor into @O_ID,@A_Salary
end
//關閉游標
close mycursor
//撤銷游標
deallocate mycursor
GO
?
通過上面的注釋,我想大家都明白了整個游標的創建過程了吧。但是我們現在還是一個抽象的了解,我們學任何知識,都要用于實踐,這樣才能使抽象的東西變的具體。
那我們就運行這個存儲過程,看看游標到底是怎么取值的:
我們打開SQLSERVER2000的查詢分析器,制定好數據庫后,我們執行存儲過程
Exec PK_Test

讓我看看效果吧(如圖)


通過實例我們可以看到游標逐行逐行都把值都取出來了。那么我請大家先不看下面的答案,在引言部分我剛才留個大家的問題試一下能不能解決?
現在我們寫一個存儲過程解決剛才我留下來的問題吧
CREATE PROCEDURE PK_SalaryAdd
AS
declare @O_ID nvarchar(20),@A_Salary float
declare mycursor cursor for select O_ID,A_Salary from AddSalary
open mycursor
fetch next from mycursor into @O_ID,@A_Salary
while(@@fetch_status = 0)
begin
Update OriginSalary set O_Salary=O_Salary+@A_Salary where O_ID=@O_ID
fetch next from mycursor into @O_ID,@A_Salary
end
close mycursor
deallocate mycursor
GO
?
按照老方法,我們用查詢分析器來執行我們的存儲過程,看看結果是怎么樣的?
Exec PK_SalaryAdd
讓我看看效果吧(如圖)


執行存儲過程,看到我們影響了3行數據

??
用sql語句,看看表OriginSalary現在的結果:???????????????????????????????????????????????????????

?


?

1.4 結束語
?很高興大家能把這個教程看完,其實這只是游標的最最基礎的一個應用,顯示生活的邏輯的關系中,可能有更復雜的游標。但是我們只有學會走路,才能跑步嘛,o(∩_∩)o…。

?

轉載于:https://www.cnblogs.com/XUANLIU2016/p/5789231.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395265.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395265.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為什么Docker對初創企業有意義

by Charly Vega查理維加(Charly Vega) 為什么Docker對初創企業有意義 (Why Docker makes sense for startups) Docker is becoming the standard to develop and run containerized applications.Docker正在成為開發和運行容器化應用程序的標準。 Long ago, this piece of te…

MyEclipse中Maven Web項目部署路徑設置

轉載于:https://www.cnblogs.com/langzichanglu/p/10336805.html

小米電視聯網后顯示無法解析小米電視服務器,小米電視連上無線不能上網怎么回事?教你解決辦法...

原標題&#xff1a;小米電視連上無線不能上網怎么回事&#xff1f;教你解決辦法互聯網電視憑借在線觀看影視劇這個獨有的優勢受到越來越多家庭的喜愛。特別是配置不俗的小米電視&#xff0c;然而隨之而來的的問題也讓很多用戶頭疼&#xff0c;比如家里的小米電視突然上不了網了…

配置Server Side TAF

實驗環境&#xff1a;Oracle 11.2.0.4 RAC1.為設置TAF在RAC集群上新建服務2.啟動server_taf服務3.檢查確認服務正在運行4.找到剛創建服務的service_id5.根據service_id審查服務的信息6.給服務添加server side failover參數7.再次審查服務可以看到Method, Type和Retries值8.檢查…

fgets阻塞 stdin 退出_來自stdin問題的fgets[c]

我試過你的代碼,但無法重現問題。以下代碼的工作方式正是您所期望的,它會提示您輸入名稱,等待您鍵入名稱,然后提示您輸入地址,等等。我想知道你是否不需要在提示輸入更多信息之前閱讀stdin并清空它?typedef struct {char* name;char* address;}employeeRecord;int readrecord(…

2016.08.19

轉載于:https://www.cnblogs.com/hiramlee0534/p/5789453.html

服務器上運行arp,服務器ARP病毒的特征及防護說明

服務器ARP病毒的特征及防護說明更新時間&#xff1a;2008年01月29日 15:50:33 作者&#xff1a;服務器ARP病毒的特征及防護說明近期有些用戶反映服務器上所有網站被插入了病毒代碼,但是這些病毒代碼在服務器的源文件上并不能找到,因此,網管想清理病毒也無從下手,這是什么原因…

使用React Native進行氣泡動畫

by Narendra N Shetty由納倫德拉N謝蒂(Narendra N Shetty) 使用React Native進行氣泡動畫 (Bubble animation with React Native) 使用Animated和PanResponder構建React Native應用程序時獲得的經驗教訓 (Lessons learned while building a React Native App using Animated a…

Machine Learning from Start to Finish with Scikit-Learn

2019獨角獸企業重金招聘Python工程師標準>>> Machine Learning from Start to Finish with Scikit-Learn This notebook covers the basic Machine Learning process in Python step-by-step. Go from raw data to at least 78% accuracy on the Titanic Survivors …

Excel 宏編碼實現,指定列的字符串截取

1、打開Excel憑證&#xff0c;啟用宏&#xff0c;ALTF11 或 菜單“視圖”-"宏-查看宏" Sub 分割字符串1() Dim i As Integer Dim b() As String Dim length 用length表示數組的長度 Dim sublength Dim bb() As String 篩選日期 2 點 For i 2 To 20000 b() Split(Ce…

mysql for update 鎖_MySql FOR UPDATE 鎖的一點問題……

問題描述假設一個情況&#xff0c;這里只是假設&#xff0c;真實的情況可能不會這樣設計&#xff0c;但是假如真的發生了....鐵老大有一張這樣的ticket表&#xff0c;用來存放北京到上海的票。iduidstart_addrend_addrbook_time11300009860上海北京1386666032120上海北京30上海…

服務器機房新風系統,某機房新風系統設計方案參考

《某機房新風系統設計方案參考》由會員分享&#xff0c;可在線閱讀&#xff0c;更多相關《某機房新風系統設計方案參考(3頁珍藏版)》請在人人文庫網上搜索。1、某機房新風系統設計方案參考根據以上要求并結合中華人民共和國電子計算機機房的設計規范&#xff0c;為保證機房正壓…

css 畫三角形

CSS三角形繪制方法#triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;}#triangle-down {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid trans…

面試官面試前端_如何面試面試官

面試官面試前端by Aline Lerner通過艾琳勒納(Aline Lerner) 如何面試面試官 (How to interview your interviewers) For the last few semesters, I’ve had the distinct pleasure of guest-lecturing MIT’s required technical communication class for computer science m…

shell 字符串分割

語法1: substring${string:start:len} string的下標從0開始&#xff0c;以start可是&#xff0c;截取len個字符&#xff0c;并賦值于substring 1 #!/bin/bash 2 #substr${string:start:len} 3 str"123456789" 4 substr${str:3:3} 5 echo $substr 6 7 輸出&#xff1…

方格取數(網絡流)

題目鏈接&#xff1a;ヾ(≧?≦*)ゝ 大致題意&#xff1a;給你一個\(n*m\)的矩陣&#xff0c;可以取任意多個數&#xff0c;但若你取了一個數&#xff0c;那么這個數上下左右的數你就都不能取&#xff0c;問能取到的最大值是多少。 Solution: 首先&#xff0c;我們可以把矩陣上…

mysql創建的數據庫都在哪里看_mysql 怎么查看創建的數據庫和表

1、 //看當前使用的是哪個數據庫 ,如果你還沒選擇任何數據庫&#xff0c;結果是NULL。mysql>select database(); ------------ | DATABASE() | ------------ | menagerie | ------------2、//查看有哪些數據庫 mysql> show databases;--------------------| Database …

wordpress 基礎文件

需要用到的PHP基礎文件有&#xff1a; 404.php404模板 rtl.css 如果網站的閱讀方向是自右向左的&#xff0c;會被自動包含進來comments.php 評論模板single.php文章模板。顯示單獨的一篇文章時被調用&#xff0c;如果模板不存在會使用 index.phpsingle-<post-type>.php自…

ajax請求 apend,jsp如何獲取ajax append的數據?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓我在網上下了個上傳圖片的js&#xff0c;我想上傳圖片的時候還提交一些參數&#xff0c;但是后臺用request.getParameter("th");獲取出來是nullfunction uploadSubmitHandler () {if (state.fileBatch.length ! 0) {var …

linux 機器格式化_為什么機器人應該為我們格式化代碼

linux 機器格式化by Artem Sapegin通過Artem Sapegin 為什么機器人應該為我們格式化代碼 (Why robots should format our code for us) I used to think that a personal code style is a good thing for a programmer. It shows you are a mature developer who knows what g…