第14篇 SQL游标、函数的使用方法

原创 2015年11月18日 22:58:17
     游标的的使用有日常的开发和维护的过程不使用的并不多,但是碰到一些棘手的问题的时候,游标时常是个非常好的帮手,下面就说下游标的使用方法,方法自己以后查阅,和加深一些印象,下面以一个存储过程为例
 
 T-SQL中的游标定义在MSDN中如下:

DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] 
     [ FORWARD_ONLY | SCROLL ] 
     [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
     [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
     [ TYPE_WARNING ] 
     FOR select_statement 
     [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
[;]

 

 
ALTER PROCEDURE [dbo]. [XXXX]
    @ProcessName NVARCHAR (20) ---流程名
AS
    DECLARE @tempIncident INT
    DECLARE @tempCode NVARCHAR( 20)
    DECLARE @incident NVARCHAR( 100) ---实例号
    DECLARE @bicode NVARCHAR( 200)--- 单号
    DECLARE @taskCnt INT ---task为的数量
    DECLARE @flag INT
    DECLARE @bflag INT
    SET @flag = 0
    SET @bflag = 0
   
    ----定义一个游标--
    ----定义游标和定义一个变量是差不多的,不过后面要指定一个的查询语句,
    DECLARE mycur CURSOR
    FOR
        ( SELECT     bic. BI_Code ,----这时两个的数据是要使用的数据
                    bic.BI_Incident
          FROM    xxxxx AS inc ,
                    bic AS bic
          WHERE     inc .PROCESSNAME = bic .BI_ProcessName
                    AND INCIDENT = bic.BI_Incident
                    AND PROCESSNAME = @ProcessName
                    AND inc .STATUS = 2
                    AND ( bic. BI_AuditState = 4010
                          OR bic .BI_AuditState = 4040
                        )
        )
    OPEN mycur--打开这个游标
       
    FETCH NEXT FROM mycur INTO @tempCode, @tempIncident ---把值放到变量中
      --循环这个值
      --这是一个系统的取游标值的一个变量
    WHILE @@FETCH_STATUS = 0
        BEGIN
            SELECT  @taskCnt = COUNT(*)
            FROM    xxxxx
            WHERE   INCIDENT = @tempIncident
                    AND PROCESSNAME = @ProcessName
                    AND STATUS = 1
               
            IF @taskCnt > 0 ---有task=1 的数据则是可以自动处理的
                BEGIN
                    IF @flag = 0
                        BEGIN
                            SET @incident = CAST(@tempIncident AS NVARCHAR) 
                        END
                    ELSE
                        SET @incident = @incident + ','
                            + CAST (@tempIncident AS NVARCHAR )
                    SET @flag = 1
                END
           
            ELSE
                BEGIN
                    IF @bflag = 0
                        SET @bicode = @tempCode
                    ELSE
                        SET @bicode = @bicode + ',' + @tempCode
                    SET @bflag = 1
                END
             ---这里的是把数据再次放到变量里面,以便循环的使用
            FETCH NEXT FROM mycur INTO @tempCode, @tempIncident
        END
    CLOSE mycur
    DEALLOCATE mycur
    IF @bicode IS NULL
        SET @bicode = 'NULL'
    IF @incident IS NULL
        SET @incident = 'NULL'
    ELSE
        UPDATE  xxxxx
        SET     STATUS = 1
        WHERE   PROCESSNAME = @ProcessName
                AND INCIDENT IN ( SELECT     value
                                  FROM      dbo .fn_Split( @incident, ',') )
    
 
    

 

 

SQL 函数的使用:

函数在SQL中的使用提高了SQL代码的重复利用,也方便我们更高效的去用SQL做更多的事:下面我就对标量的函数进行说明,其它的东西也基本上是大同小异.

1、标量函数

Create function 函数名(参数)

Returns 返回值数据类型

[with {Encryption | Schemabinding }]

[as]

begin

SQL语句(必须有return 变量或值)

 

 

例如:

ALTER FUNCTION [dbo]. [fn_Split](@sText varchar( 8000), @sDelim varchar(20 ) = ' ')
RETURNS @retArray TABLE (idx smallint Primary Key, value varchar(8000 ) COLLATE SQL_Latin1_General_CP1_CI_AS )

这样就是把一个函数的基本形式定义好了 如同在代码中写出 public string get(){}

后面的代码也就是日常的sql查询或者是一些的特殊的处理

 
ALTER   FUNCTION [dbo]. [fn_Split](@sText varchar( 8000), @sDelim varchar(20 ) = ' ')
 RETURNS @retArray TABLE (idx smallint Primary Key, value varchar(8000 ) COLLATE SQL_Latin1_General_CP1_CI_AS )
 AS
 BEGIN
 DECLARE @idx smallint ,
  @value varchar(8000 ),
  @bcontinue bit,
  @iStrike smallint,
  @iDelimlength tinyint
 
IF @sDelim = 'Space'
 BEGIN
 SET @sDelim = ' '
 END
 
SET @idx = 0
SET @sText = LTrim(RTrim (@sText))
SET @iDelimlength = DATALENGTH(@sDelim )
SET @bcontinue = 1
 
IF NOT ((@iDelimlength = 0 ) or (@sDelim = 'Empty'))
 BEGIN
 WHILE @bcontinue = 1
  BEGIN
  --If you can find the delimiter in the text, retrieve the first element and
   --insert it with its index into the return table.
    IF CHARINDEX (@sDelim, @sText)> 0
    BEGIN
    SET @value = SUBSTRING(@sText ,1, CHARINDEX( @sDelim,@sText )-1)
     BEGIN
     INSERT @retArray (idx , value )
     VALUES (@idx , @value )
     END
 
    --Trim the element and its delimiter from the front of the string.
    --Increment the index and loop.
    SET @iStrike = DATALENGTH(@value ) + @iDelimlength
    SET @idx = @idx + 1
    SET @sText = LTrim(Right(@sText ,DATALENGTH( @sText) - @iStrike ))
 
    END
   ELSE
    BEGIN
    --If you can’t find the delimiter in the text, @sText is the last value in
    --@retArray.
      SET @value = @sText
     BEGIN
     INSERT @retArray (idx , value )
     VALUES (@idx , @value )
     END
    --Exit the WHILE loop.
    SET @bcontinue = 0
    END
   END
  END
 ELSE
  BEGIN
  WHILE @bcontinue=1
   BEGIN
   --If the delimiter is an empty string, check for remaining text
   --instead of a delimiter. Insert the first character into the
   --retArray table. Trim the character from the front of the string.
   --Increment the index and loop.
   IF DATALENGTH(@sText )>1
    BEGIN
    SET @value = SUBSTRING(@sText ,1, 1)
     BEGIN
     INSERT @retArray (idx , value )
     VALUES (@idx , @value )
     END
    SET @idx = @idx+1
    SET @sText = SUBSTRING(@sText ,2, DATALENGTH(@sText )-1)
 
    END
   ELSE
    BEGIN
    --One character remains.
    --Insert the character, and exit the WHILE loop.
    INSERT @retArray (idx , value )
    VALUES (@idx , @sText )
    SET @bcontinue = 0
    END
  END
 
 END
 
 RETURN
 END

 

 
版权声明:本文为博主原创文章,未经博主允许不得转载。个人独立博客:http://blog.laofu.online/

SQL游标原理和使用方法.doc

  • 2010年09月08日 13:34
  • 114KB
  • 下载

Oracle PL/SQL游标的使用方法

--演示隐式游标,系统自动声明,自动打开,自动使用并且自动关闭 begin update emp set sal = 1000; dbms_output.put_...

SQL游标原理和使用方法

数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?...

SQL游标原理和使用方法

在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢...
  • j315321
  • j315321
  • 2011年07月06日 00:02
  • 225

PL/SQL ORACLE游标的使用方法

隐式游标  隐式游标的属性等在第四章笔记中已记录了一部分  如果要确保属性指向想要的SQL语句,那么就在SQL语句执行后,立即将属性值保存到一个本地变量中  用存储过程来实现这种效果:  先定...

SQL游标原理和使用方法

数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?...

用顺口溜快速记忆SQL游标的使用方法

SQL中的游标在处理一些需要循环处理的逻辑时很有用处,但是由于使用频率相对较低,经常会忘记使用方法,每用一次就要Google一次,很有挫败感。于是下定决心要记在脑海了,于是就想到编写一个顺口溜“口诀”...
  • ETZRP
  • ETZRP
  • 2011年09月22日 12:34
  • 1385

解析数据库中游标的使用方法

  • 2012年03月16日 15:41
  • 21KB
  • 下载

Oracle游标使用方法及语法大全

  • 2012年11月30日 13:13
  • 933KB
  • 下载

mongod统计(类似sql group by)aggregate函数使用方法

使用方法: db.collection.aggregate([array]); array可是是任何一个或多个操作符。 操作符介绍: $project:包含、排除、重命名和显示字段 $mat...
  • k21325
  • k21325
  • 2016年11月22日 15:46
  • 210
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第14篇 SQL游标、函数的使用方法
举报原因:
原因补充:

(最多只允许输入30个字)