在存储过程中返回数据的三种方法

转自:http://hi.baidu.com/huitonet/blog/item/8d31743e2ff4f93c71cf6c40.html

今天和一个网友讨论了一个关于存储过程的数据返回的问题,特此总结了一下,把它写给大家,仅供参考。
    在存储过程中,数据的返回有三种方法,当我们编写一个存储过程时,我们应该考虑前台绑定数据的方式而采取不同的返回方法。
    第一:select方法
      select是我们最常用的方法,它将数据作为标准的纪录集合返回。
    第二:return方法
      return 提供了返回状态值得方法,这个值一定要是个整数值。不要试图返回一个非整形的数据类型。
    第三:output方法:
      提供了返回参数值的方法。它可以将指定的参数返回。
请看下面的依照上面的顺序的举例:

CREATE PROCEDURE Sp_check_toq_task
     @present_time varchar(12),
AS
SET NOCOUNT ON
DECLARE @send_task_mask INT   ///要返回的值
DECLARE @active_time varchar(12)
DECLARE @fail_time    varchar(12)
DECLARE @block_time   int
DECLARE @apply_days   varchar(9)
DECLARE @task_type    int
DECLARE @now_state    int
DECLARE @weekofday    varchar(3)

DECLARE @present_number_time int
DECLARE @active_number_time   int
DECLARE @fail_number_time     int
DECLARE @old_time           Datetime

--- what is day of week to today
SET @weekofday = CASE DATENAME(WEEKDAY, GETDATE())
        WHEN ’Monday’       THEN   ’1’
        WHEN ’Tuesday’      THEN   ’2’
        WHEN ’Wednesday’    THEN   ’3’
        WHEN ’Thursday’     THEN   ’4’
        WHEN ’Friday’       THEN   ’5’
        WHEN ’Saturday’     THEN   ’6’
        WHEN ’Sunday’       THEN   ’7’
        ELSE                      ’0’
        END   
--- init task mask to 0
SET @send_task_mask = 0
--- convert string time to int time
SET @present_number_time = CONVERT(INT,RTRIM(@present_time))
--- declare cursor          
DECLARE check_task_cursor CURSOR LOCAL DYNAMIC FOR SELECT start_time,end_time,seprate_time,affect_days,data_type,recently_time,present_status
        FROM Toq_task_list
        WHERE affect_days LIKE
        ’%’ + rtrim(@weekofday) + ’%’ and present_status = 0 AND ABS(DATEDIFF(MI,recently_time, GETDATE())) >= seprate_time   
         FOR UPDATE OF recently_time
      
--- open recdord set  
OPEN check_task_cursor
--- fill variable
FETCH NEXT FROM check_task_cursor INTO @active_time,@fail_time,@block_time,@apply_days,@task_type,@old_time,@now_state
WHILE @@FETCH_STATUS = 0
BEGIN      
     --- above of all, convert string to number
     SET @active_number_time = CONVERT(INT,rtrim(@active_time))
     SET @fail_number_time    = CONVERT(INT,rtrim(@fail_time))
    ----- IF((@present_number_time > @active_number_time) and (@present_number_time <= @fail_number_time)) BEGIN       
     IF((@present_number_time - @active_number_time>= @block_time) and (@present_number_time <= @fail_time)) BEGIN   
           SET @send_task_mask = @send_task_mask | @task_type
           BEGIN TRANSACTION
               UPDATE Toq_task_list SET recently_time = getdate() WHERE CURRENT OF check_task_cursor
           COMMIT
     END
     FETCH NEXT FROM check_task_cursor INTO @active_time,@fail_time,@block_time,@apply_days,@task_type,@old_time,@now_state
END
--- close sursor
CLOSE check_task_cursor
--- free malloc
DEALLOCATE check_task_cursor
SELECT (@send_task_mask) AS task_mask ///将@send_task_mask
//作为标准记录集合返回

-----------------------------------------------------------

CREATE PROCEDURE Sp_check_toq_task
     @present_time varchar(12),
AS
SET NOCOUNT ON
DECLARE @send_task_mask INT   ///要返回的值
DECLARE @active_time varchar(12)
DECLARE @fail_time    varchar(12)
DECLARE @block_time   int
DECLARE @apply_days   varchar(9)
DECLARE @task_type    int
DECLARE @now_state    int
DECLARE @weekofday    varchar(3)

DECLARE @present_number_time int
DECLARE @active_number_time   int
DECLARE @fail_number_time     int
DECLARE @old_time           Datetime

--- what is day of week to today
SET @weekofday = CASE DATENAME(WEEKDAY, GETDATE())
        WHEN ’Monday’       THEN   ’1’
        WHEN ’Tuesday’      THEN   ’2’
        WHEN ’Wednesday’    THEN   ’3’
        WHEN ’Thursday’     THEN   ’4’
        WHEN ’Friday’       THEN   ’5’
        WHEN ’Saturday’     THEN   ’6’
        WHEN ’Sunday’       THEN   ’7’
        ELSE                      ’0’
        END   
--- init task mask to 0
SET @send_task_mask = 0
--- convert string time to int time
SET @present_number_time = CONVERT(INT,RTRIM(@present_time))
--- declare cursor          
DECLARE check_task_cursor CURSOR LOCAL DYNAMIC FOR SELECT start_time,end_time,seprate_time,affect_days,data_type,recently_time,present_status
        FROM Toq_task_list
        WHERE affect_days LIKE
        ’%’ + rtrim(@weekofday) + ’%’ and present_status = 0 AND ABS(DATEDIFF(MI,recently_time, GETDATE())) >= seprate_time   
         FOR UPDATE OF recently_time
      
--- open recdord set  
OPEN check_task_cursor
--- fill variable
FETCH NEXT FROM check_task_cursor INTO @active_time,@fail_time,@block_time,@apply_days,@task_type,@old_time,@now_state
WHILE @@FETCH_STATUS = 0
BEGIN      
     --- above of all, convert string to number
     SET @active_number_time = CONVERT(INT,rtrim(@active_time))
     SET @fail_number_time    = CONVERT(INT,rtrim(@fail_time))
    ----- IF((@present_number_time > @active_number_time) and (@present_number_time <= @fail_number_time)) BEGIN       
     IF((@present_number_time - @active_number_time>= @block_time) and (@present_number_time <= @fail_time)) BEGIN   
           SET @send_task_mask = @send_task_mask | @task_type
           BEGIN TRANSACTION
               UPDATE Toq_task_list SET recently_time = getdate() WHERE CURRENT OF check_task_cursor
           COMMIT
     END
     FETCH NEXT FROM check_task_cursor INTO @active_time,@fail_time,@block_time,@apply_days,@task_type,@old_time,@now_state
END
--- close sursor
CLOSE check_task_cursor
--- free malloc
DEALLOCATE check_task_cursor
return (@send_task_mask) ///作为状态码返回

-----------------------------------------------------------

CREATE PROCEDURE Sp_check_toq_task
     @present_time varchar(12),
     @send_task_mask    int output ///指定这个参数为返回值
AS
SET NOCOUNT ON
DECLARE @active_time varchar(12)
DECLARE @fail_time    varchar(12)
DECLARE @block_time   int
DECLARE @apply_days   varchar(9)
DECLARE @task_type    int
DECLARE @now_state    int
DECLARE @weekofday    varchar(3)

DECLARE @present_number_time int
DECLARE @active_number_time   int
DECLARE @fail_number_time     int
DECLARE @old_time           Datetime

--- what is day of week to today
SET @weekofday = CASE DATENAME(WEEKDAY, GETDATE())
        WHEN ’Monday’       THEN   ’1’
        WHEN ’Tuesday’      THEN   ’2’
        WHEN ’Wednesday’    THEN   ’3’
        WHEN ’Thursday’     THEN   ’4’
        WHEN ’Friday’       THEN   ’5’
        WHEN ’Saturday’     THEN   ’6’
        WHEN ’Sunday’       THEN   ’7’
        ELSE                      ’0’
        END   
--- init task mask to 0
SET @send_task_mask = 0
--- convert string time to int time
SET @present_number_time = CONVERT(INT,RTRIM(@present_time))
--- declare cursor          
DECLARE check_task_cursor CURSOR LOCAL DYNAMIC FOR SELECT start_time,end_time,seprate_time,affect_days,data_type,recently_time,present_status
        FROM Toq_task_list
        WHERE affect_days LIKE
        ’%’ + rtrim(@weekofday) + ’%’ and present_status = 0 AND ABS(DATEDIFF(MI,recently_time, GETDATE())) >= seprate_time   
         FOR UPDATE OF recently_time
      
--- open recdord set  
OPEN check_task_cursor
--- fill variable
FETCH NEXT FROM check_task_cursor INTO @active_time,@fail_time,@block_time,@apply_days,@task_type,@old_time,@now_state
WHILE @@FETCH_STATUS = 0
BEGIN      
     --- above of all, convert string to number
     SET @active_number_time = CONVERT(INT,rtrim(@active_time))
     SET @fail_number_time    = CONVERT(INT,rtrim(@fail_time))
    ----- IF((@present_number_time > @active_number_time) and (@present_number_time <= @fail_number_time)) BEGIN       
     IF((@present_number_time - @active_number_time>= @block_time) and (@present_number_time <= @fail_time)) BEGIN   
           SET @send_task_mask = @send_task_mask | @task_type
           BEGIN TRANSACTION
               UPDATE Toq_task_list SET recently_time = getdate() WHERE CURRENT OF check_task_cursor
           COMMIT
     END
     FETCH NEXT FROM check_task_cursor INTO @active_time,@fail_time,@block_time,@apply_days,@task_type,@old_time,@now_state
END
--- close sursor
CLOSE check_task_cursor
--- free malloc
DEALLOCATE check_task_cursor
因为@send_task_mask有了OUTPUT的定义,它将自动返回给客户
端,所以它不需要任何的返回指令

显然返回数据的三种方法,有各自的优点和缺点
SELECT 对资源的开销比较大,因为它将数据作为记录集合而返回,
它最大的优点是客户端可以常规的方便的取出数据。
RETURN 对资源的开销比较小,但它限定了数据类型为整形,适应面
不广,而且客户端要做一些特殊判断才能取出数据。
OUTPUT 对资源的开销比较小,适应各种数据类型,而且服务端不需要做数据类型转换,减少了服务端的负担。它唯一的缺点是要多做一些特殊判断才能取出数据。

下面给出了在DB-LIBRARY中分别对应的取数据用到的函数:
    1。SELECT:DBBIND
    2。RETURN:DBHASRETSTAT
    3。OUTPUT:DBNUMREC、DBRETDATA
这些函数的具体用法,我就不罗嗦了!各位大虾自己去查资料吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值