1. 程式人生 > >MSSQL之遊標的用法

MSSQL之遊標的用法

再來看看MSSQL中的遊標。
我們知道所有SQL語句都在行集上執行。SELECT語句返回包含所有滿足SELECT語句限定條件的行的完整結果集。應用程式需要一次處理結果集的一行或一個行塊。遊標是結果集的邏輯擴充套件,它使應用程式得以逐行處理結果集。
SQL SERVER支援多種指定遊標的機制: 
1、Transact-SQL支援用於管理遊標的SQL-92 DECLARE CURSOR、OPEN、FETCH 和CLOSE語句。Transact-SQL還支援遊標擴充套件,如: 
  (1)、允許對重新使用遊標進行優化的DEALLOCATE語句。//刪除遊標
  (2)、定義Transact-SQL變數以具有遊標資料型別,然後用它引用遊標。
  (3)、定義具有區域性或全域性作用域的遊標。
  (4)、在DECLARE CURSOR 語句內指定符合OLE DB和ODBC規範的遊標型別(FORWARD_ONLY、STATIC、KEYSET和  DYNAMIC)。 
2、用於SQL Server的Microsoft OLE DB 提供程式支援ADO和OLE DB API的遊標功能。
3、Microsoft SQL Server ODBC驅動程式支援ODBC、RDO、DAO和Microsoft基礎類資料庫類API的遊標功能。
4、用於C語言的Microsoft嵌入式SQL支援嵌入式SQL標準的遊標功能。
5、DB-Library API支援與OLE DB和ODBC API相同級別的遊標功能。 

首先,我們建立一個銀行資訊表
IF OBJECT_ID('bankInfo') IS NOT NULL 
DROP TABLE bankInfo
GO
--銀行卡資訊表
CREATE TABLE bankInfo
(
   uId VARCHAR(18) NOT NULL PRIMARY KEY,--卡號
   uName VARCHAR(20), --卡主姓名
   uMoney MONEY       --卡中餘額
)
GO
INSERT INTO bankInfo VALUES('9559901','張三',1)
INSERT INTO bankInfo VALUES('9559902','李四',1000)
INSERT INTO bankInfo VALUES('9559903','王五',800)
INSERT INTO bankInfo VALUES('9559904','趙六',50)
INSERT INTO bankInfo VALUES('9559905','趙明',5)

SELECT * FROM bankInfo,結果顯示如下:
/*
uId                uName                uMoney
------------------ -------------------- ---------------------
9559901            張三                   1.00
9559902            李四                   1000.00
9559903            王五                   800.00
9559904            趙六                   50.00
9559905            趙明                   5.00

(5 行受影響)
*/
建立了遊標之後,必須要開啟才能使用,還是用T-SQL舉個示例來說明一下游標的使用
-----------遊標的使用----------------
DEALLOCATE CursorBank  --刪除遊標
GO
--------定義遊標-----------------
DECLARE CursorBank CURSOR SCROLL  
FOR SELECT * FROM bankInfo
GO
OPEN CursorBank --從遊標讀取資料前必須先開啟遊標
FETCH FIRST FROM CursorBank  --讀取第一行
/*
uId                uName                uMoney
------------------ -------------------- ---------------------
9559901            張三                   401.00

(1 行受影響)
*/

FETCH NEXT FROM CursorBank   --上次讀取行的下一行
/*
uId                uName                uMoney
------------------ -------------------- ---------------------
9559902            李四                   600.00

(1 行受影響)
*/

FETCH PRIOR FROM CursorBank  --上次讀取行的上一行
/*
uId                uName                uMoney
------------------ -------------------- ---------------------
9559901            張三                   401.00

(1 行受影響)
*/

FETCH LAST FROM CursorBank   --最後一行
/*
uId                uName                uMoney
------------------ -------------------- ---------------------
9559905            趙明                   5.00

(1 行受影響)
*/

FETCH ABSOLUTE 2 FROM CursorBank --定位到第三行
/*
uId                uName                uMoney
------------------ -------------------- ---------------------
9559902            李四                   600.00

(1 行受影響)
*/

FETCH RELATIVE -1 FROM CursorBank --相對位置定位,根據當前遊標位置
/*
uId                uName                uMoney
------------------ -------------------- ---------------------
9559901            張三                   401.00

(1 行受影響)
*/
來看一個綜合點的遊標應用
--通過遊標讀取資料,如果餘額大於等於500,
--則顯示該儲戶為貴賓客戶
--全域性變數@@FETCH_STATUS表示上一個FETCH是否讀取
--到了資料,其返回值型別為int型
--  值有三種:
--   0 : FETCH語句成功
--  -1 : FETCH語句失敗或此行不在結果集中
--  -2 : 被提取行不存在
sql語句如下:
DECLARE @id VARCHAR(12),@name VARCHAR(20)
DECLARE @getMoney MONEY
FETCH FIRST FROM CursorBank INTO @id,@name,@getMoney
WHILE @@FETCH_STATUS=0 --上一個fetch是否讀取到了資料
    BEGIN 
      IF(@getMoney>500)
        PRINT '你是VIP使用者'+',賬號:'[email protected]+',姓名:'[email protected]+',賬戶餘額:'+CONVERT(VARCHAR(12),@getMoney)
      ELSE
        PRINT @name+',您不是VIP使用者!'    
      FETCH NEXT FROM CursorBank INTO @id,@name,@getMoney
    END
執行結果如下:
/*
張三,您不是VIP使用者!
你是VIP使用者,賬號:9559902,姓名:李四,賬戶餘額:600.00
你是VIP使用者,賬號:9559903,姓名:王五,賬戶餘額:800.00
趙六,您不是VIP使用者!
趙明,您不是VIP使用者!
*/
   以上是關於MSSQL中游標的簡單示例,我只是簡單總結一下,新手可以看看,SQL高手就沒必要了。寫的不對的地方歡迎批評指正。關於遊標的高階用法還是得在專案中慢慢積累和學習。

相關推薦

MSSQL遊標用法

再來看看MSSQL中的遊標。 我們知道所有SQL語句都在行集上執行。SELECT語句返回包含所有滿足SELECT語句限定條件的行的完整結果集。應用程式需要一次處理結果集的一行或一個行塊。遊標是結果集的邏輯擴充套件,它使應用程式得以逐行處理結果集。 SQL SERVER支援多

sql serverexists用法

nbsp http ima 技術分享 mage .com .cn img bsp sql server之exists用法

linuxsed用法

sil 資料 log sed的用法 單位 welcome 數據 讀取 local sed是一個很好的文件處理工具,本身是一個管道命令,主要是以行為單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作,下面先了解一下sed的用法 sed命令行格式為:

Socketshutdown()用法

超出 線程 出現 shutdown ket 如果 函數 嘗試 通信 通常來說,socket是雙向的,即數據是雙向通信的。但有些時候,你會想在socket上實現單向的socket,即數據往一個方向傳輸。 單向的socket便稱為半開放Socket。要實現半開放式,需要用到sh

【轉載】linuxsed用法

span 變量 常用 tdi 選擇 包括 div 輸入 記得 linux之sed用法 原文地址:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一個很好的文件處理工具,本身是

遊標用法

mem eva from idf function etc acc cti 更新數據 DECLARE @functionIdf int DECLARE @namef varchar(500) DECLARE My_Cursor CURSOR --定義遊標FOR (SELEC

linuxsort用法

asc 成功 部分 需要 字符 linu 是把 內容 div linux之sort用法 sort命令是幫我們依據不同的數據類型進行排序,其語法及常用參數格式:   sort [-bcfMnrtk][源文件][-o 輸出文件] 補充說明:sort可針對文本文件的內

JavaHashMap用法

nsvalue 隨機 random pac ring highlight pap span true 源碼: 1 package test_demo; 2 3 import java.util.HashMap; 4 import java.util.Iterat

vuewatch用法

example method cli $watch def pyc 技術 實例 ner 對應一個對象,鍵是觀察表達式,值是對應回調。值也可以是方法名,或者是對象,包含選項。在實例化時為每個鍵調用 $watch() ; //使用官方vue-cli腳手架書寫<te

C#基礎教程IComparable用法,實現List.sort()排序

排序 跑步 地址 parent reading result object http 第k大的數 List<T>.sort()可以實現對T的排序,比如List<int>.sort()執行後集合會按照int從小到大排序。如果T是一個自定義的Objec

LINUX sed用法

sed用法 Linux sed命令是利用script來處理文本文件 sed可依照script的指令,來處理、編輯文本文件 sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等 語法 sed [-hnV][-e<script>][-

(轉)Linux命令Ethtool用法詳解

如果 size ram phy 基本設置 速度 終端 網卡驅動 sed Linux命令之Ethtool用法詳解 原文:http://www.linuxidc.com/Linux/2012-01/52669.htm Linux/Unix命令之Ethtool描述:Eth

C#中操作數據庫技術ExecuteNonQuery用法

pen cte assign == ted for 返回 簡單的 splay 最近在補基礎知識,剛好補到C#中對數據庫操作的一些技術,今天學習了ExecuteNonQuery的東西,看自己項目維護項目的代碼和網上資料查詢,基本上搞懂了ExecuteNonQuery的用法,小

1.12-linux三劍客awk用法詳解

-a proc == 行號 oss url oldboyedu rap oai 1.12linux三劍客之awk用法詳解內容:1. awk執行過程2. awk命令格式3. awk用法4. awk數組第1章 awk執行過程 一直讀取到文件的最後一行第2章 awk ‘找誰{幹啥

馬哥學習-----李洋個人筆記--sed用法

sed簡介 基礎命令 Stream EDitor, 行文本編輯器sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,如果讀入的行不符合需求,則不處理直接把內容送往屏幕,符合需求的內容處理

vueslot用法

highlight port one scrip 用法 har component 技術 src slot元素作為組件模板之中的內容分發插槽。這個元素自身將被替換。 有 name 特性的 slot 稱為具名 slot。 有 slot 特性的內容將分發到名字相匹配的具名 s

linux命令grep用法介紹

之前 -o 空字符 寫法 文本搜索工具 inter 正則表達 空白字符 符號 Linux系統中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表

STLdeque用法

ase ssi push clear opera 大小 wap num 入隊 deque:雙端隊列 底層是一個雙向鏈表。 常用的有隊列的尾部入隊、首部出隊。 摘自:http://www.cnblogs.com/liubilan/p/9461141.html dequ

Python鏈接MssqlPython庫pymssql

example 返回 自動 lua 連接數 dog con fetchone 數據庫 連接數據庫 pymssql連接數據庫的方式和使用sqlite的方式基本相同: 使用connect創建連接對象 connect.cursor創建遊標對象,SQL語句的執行基本都在遊

Java反射getGenericSuperclass()用法

gets 獲得 target nor com ria 反射 log weight 父類 package com.itheima.mytest;public class Person<T1, T2> {} 子類 package com.itheima.m