T-SQL---游标

T-SQL

  T-SQL---游标

  T-SQL----系统表

  T-SQL---存储过程

前言

 虽说现在orm,nosql对数据的操作会减少很多t-sql的编程,但是t-sql这应该是每个程序员要掌握的,接下来的两周准备把这块知识点进行系统总结。

什么是游标

  游标可以对一个select的结果集进行处理,或是不需要全部处理,就会返回一个对记录集进行处理之后的结果。

游标能做什么

游标实际上是一种能从多条数据记录的结果集中每次提取一条记录的机制。游标可以完成:

# 允许定位到结果集中的特定行

# 从结果集的当前位置检索一行或多行数据

# 支持对结果集中当前位置的进行修改

由于游标是将记录集进行一条条的操作,所以这样给服务器增加负担,一般在操作复杂的结果集的情况下,才使用游标。SQL Server 2005有三种游标:T-SQL游标、API游标、客户端游标。

游标的操作

游标的基本操作有定义游标、打开游标、循环读取游标、关闭游标、删除游标。

A、 定义游标

declare cursor_name --游标名称

cursor [local | global] --全局、局部

[forward only | scroll] --游标滚动方式

[read_only | scroll_locks | optimistic] --读取方式

for select_statements --查询语句

[for update | of column_name ...] --修改字段

参数:

forward only | scroll:前一个参数,游标只能向后移动;后一个参数,游标可以随意移动

read_only:只读游标

scroll_locks:游标锁定,游标在读取时,数据库会将该记录锁定,以便游标完成对记录的操作

optimistic:该参数不会锁定游标;此时,如果记录被读入游标后,对游标进行更新或删除不会超过

B、 打开游标

open cursor_name;

游标打开后,可以使用全局变量@@cursor_rows显示读取记录条数

C、 检索游标

fetch cursor_name;

检索方式如下:

fetch first; 读取第一行

fetch next; 读取下一行

fetch prior; 读取上一行

fetch last; 读取最后一行

fetch absolute n; 读取某一行

如果n为正整数,则读取第n条记录

如果n为负数,则倒数提取第n条记录

如果n为,则不读取任何记录

fetch pelative n

如果n为正整数,则读取上次读取记录之后第n条记录

如果n为负数,则读取上次读取记录之前第n条记录

如果n为,则读取上次读取的记录

D、 关闭游标

close cursor_name;

E、 删除游标

deallocate cursor_name;

实例

    --工作上的实例
    create PROCEDURE [dbo].[WeekTotalPowerBingTuByWeek]
           @DevName varchar(2000),
           @starttime varchar(200)
    AS
    BEGIN
        SET NOCOUNT ON;
        --Set @DevName=‘电表1(DTL1110321471),dianbiao$DTL1110321471;电表2(DTL1110321470),dianbiao$DTL1110321470;‘
        Declare @pointID varchar(300)
        Declare @pointName varchar(300)
        Create table #tempTable
        (
          pointName varchar(200),
          pointValue float
        )
        create table #tempTables
        (
           pointID varchar(2000),
           pointName varchar(2000)
        )
        declare @temp table(col varchar(2000))
        --set @str=replace(@str,‘|‘,‘,‘)
        while(len(@DevName)>0)
        begin
        insert into @temp
        select left(@DevName,charindex(‘;‘,@DevName)-1)
        set @DevName=stuff(@DevName,1,charindex(‘;‘,@DevName),‘‘)
        end  

        declare @name varchar(2000)
        declare @value varchar(2000)
        declare cur cursor for  select * from @temp
        open cur--打开游标
        fetch next from cur into @name
                     while @@FETCH_STATUS=0  --判断是否成功获取数据
                     begin
                     declare @str1 varchar(2000)
                     declare @str2 varchar(2000)
                     select @str1=left(@name,charindex(‘,‘,@name)-1)
                     select @str2=substring(@name,charindex(‘,‘,@name)+1,LEN(@name))
                      insert into #tempTables values (@str2,@str1)
                     fetch next from cur into @name
                     end
                    close cur --关闭游标
        deallocate cur
        Declare @starttimes varchar(200)
        Declare @endtime varchar(200)
        select @starttimes=dateadd(day,-datepart(weekday,@starttime)+1,@starttime)--开始时间
        select @endtime=dateadd(day,7-datepart(weekday,@starttime)+2,@starttime)--结束时间
        Declare Cur cursor for
        select pointID,pointName from #tempTables
                open Cur
                fetch next from cur into @pointID,@pointName
                 while @@FETCH_STATUS=0  --判断是否成功获取数据
                 begin
                    create table #temp
                    (
                       inValue float
                    )
                    declare @inValue float
                    Declare @sql varchar(8000)
                    Set @sql=‘insert into #temp select round(SUM(incrementValue),2) as incrementValue  from TAB_DAY_‘[email protected]+‘
                              where  GetValueTime > ‘‘‘[email protected]+‘‘‘ and GetValueTime < ‘‘‘[email protected]+‘‘‘‘
                    exec(@sql)
                    select @inValue=inValue from #temp
                    insert into #tempTable(pointName,pointValue) values (@pointName,@inValue)
                    drop table #temp
                   fetch next from cur into @pointID,@pointName
                 end
                close cur --关闭游标
                deallocate cur
                select * from #tempTable
                drop table #tempTable
                drop table #tempTables
    END  
时间: 2024-10-10 01:57:40

T-SQL---游标的相关文章

用SQL游标解决经典的1+2+...+100的问题!

以前从来没接触过SQL游标,今天第一次学习,就想到了编程语言里经典的1+2+...+100的问题. 环境是SqlServer2008. 建表语句: CREATE TABLE [dbo].[tCursor]( [ID] [int] NOT NULL, [Sum] [int] NULL) ON [PRIMARY] 然后填充ID为1~100,Sum为0. declare @i int set @i=1 while(@i <=100) begin insert into tCursor (ID,[Sum

SQL 游标的应用

----------------SQL游标应用-----------------if object_id('tempdb..#test0001') is not null drop table #test0001---------物料临时表create table #test0001(ItemCode nvarchar(30)----物料代码 ,SL DEC(19,3)----物料所需数量 ,RowsID Bigint----用于循环物料 )if object_id('tempdb..#test

从一个小例子认识SQL游标

原文:从一个小例子认识SQL游标 1    什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理. 这些应用程序需要一种机制以便每次处理一行或一部分行. 游标就是提供这种机制的对结果集的一种扩展. 游标通过以下方式来扩展结果处理: 允许定位在结果集的特定行. 从结果集的当前位置检索一行或一

PL/SQL游标

PL/SQL游标:A:分类:1:隐式游标:非用户明确声明而产生的游标. 你根本看不到cursor这个关键字.2:显示游标:用户明确通过cursor关键字来声明的游标. B:什么是隐式游标:1:什么时候产生:会在执行任何合法的SQL语句(DML---INSERT UPDATE DELETE DQL-----SELECT)中产生.他不一定存放数据.也有可能存放记录集所影响的行数.如果执行SELECT语句,这个时候游标会存放数据.如果执行INSERT UPDATE DELETE会存放记录影响的行数.C

PL/SQL 游标详解

刚打开游标的时候,是位于一个空行,要用fetch into 才能到第一行.只是要注意用更新游标的时候,不能在游标期间commit. 否则会报ORA-01002: fetch out of sequence就是COMMIT导致的错误.在打开有for update的cursor时,系统会给取出的数据加上排他锁(exclusive), 这样在这个锁释放前其他用户不能对这些记录作update.delete和加锁.而我一旦执行了commit,锁就释放了,游标也变成无效的,再去fetch数据时就出现错误了.

PL/SQL游标使用

游标只是一个指向查询语句返回的结果的指针,因此在游标定义时将包含一个查询定义.当游标打开后,数据被接收到一块内存区域存储,直到游标关闭. 游标实际上指向的是一块内存区域,这块内存区域位于进程全局区内部,称为上下文区域,在上下文区域中包含如下3类信息 1.查询返回的数据行 2.查询所处理的数据的行号 3.指向共享池中的已分析的SQL语句 游标实际上指向一块内存区域 游标定义时并不会获取游标数据,只有在游标被打开后,游标相关的查询语句被执行,然后将检索到的结果保存到内存中. 游标结构示意图 游标指向

Oracle数据库PL SQL游标

PL SQL游标 将hregright表中不存在hrno的记录,用house表中的hrno填充(house唯一的时候) declare cursor house_cur is select h.regno,h.hrno from house h where h.hrno is not null group by h.regno,h.hrno having count(h.regno)=1; begin for house in house_cur loop update hregright r

PL/SQL 游标 (实验七)

PL/SQL 游标 emp.dept 目标表结构及数据 要求 基于部门表建立游标dept_cursor1,使用记录变量接收游标数据,输出部门表信息: 显示格式: 部 门 号: XXX 部门名称: XXX 所在位置: XXX 基于部门表建立游标dept_cursor2,使用标量变量接收游标数据,输出部门表信息: 显示格式:部门号:XXX 部门名称:XXX 所在位置:XXX 基于雇员表建立游标emp_cursor,根据用户输入的部门号,输出该部门薪水在5000元上的雇员姓名.薪水. 显示格式:雇员姓

sql语句代编写、sql 游标 、事务代写

sql语句代编写.sql 游标 .事务代写1. AimsThis project aims to give you practice in? reading and understanding a moderately large relational schema (MyMyUNSW)? implementing SQL queries and views to satisfy requests for information? implementing SQL functions to ai

Oracle笔记 九、PL/SQL 游标的使用

--演示隐式游标,系统自动声明,自动打开,自动使用并且自动关闭 begin update emp set sal = 1000; dbms_output.put_line('影响的行数:' || sql%rowcount); end;   rollback;   /*游标的使用方法: 第一步:声明游标 第二步:打开游标 第三步:使用游标进行循环操作 第四步:关闭游标*/   --普通游标,游标本身就是一个变量 declare --下面的这行代码声明了一个游标 cursor mycur is se