`
wyzxzws
  • 浏览: 387822 次
  • 性别: Icon_minigender_1
  • 来自: dazhou
社区版块
存档分类
最新评论

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

阅读更多

转自: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
这些函数的具体用法,我就不罗嗦了!各位大虾自己去查资料吧!

分享到:
评论

相关推荐

    Delphi中调用oracle的存储过程返回数据集

    在 Delphi 中调用 Oracle 的存储过程返回数据集有两种方式,一种是使用 Oracle 提供的 OLE DB 提供程序,另一种是使用 Oracle 的 OCI(Oracle Call Interface)提供程序。这里我们主要介绍使用 OLE DB 提供程序的...

    C#中调用oracle存储过程返回数据集

    在C#中调用Oracle存储过程来返回数据集是一个常见的任务,这涉及到ADO.NET库的使用,特别是OracleClient组件。Oracle存储过程是数据库中的预编译SQL代码块,可以接收输入参数,执行复杂的业务逻辑,并返回结果。在C#...

    java存储过程返回数据集

    在Oracle数据库中,存储过程返回数据集的功能可以通过定义游标(RefCursor)来实现。与SQL Server相比,Oracle在这一方面需要额外的步骤来进行配置和处理,但通过正确的设置仍然能够达到目的。本文将详细介绍如何...

    Oracle存储过程返回结果集

    在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`参数则允许过程向调用者返回数据。而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 ...

    执行Sqlserver存储过程返回DataSet

    在软件开发过程中,经常需要与数据库进行交互,其中一种常见的场景就是通过调用存储过程来获取数据并处理这些数据。本篇文章将详细探讨如何在C#中执行SQL Server的存储过程,并将结果集封装到一个`DataSet`对象中。 ...

    oracle的存储过程如何返回结果集

    #### 三、创建存储过程返回结果集 ##### 1. 过程返回记录集 下面是一个简单的示例,展示如何创建一个存储过程来返回结果集: ```sql CREATE OR REPLACE PACKAGE pkg_test AS TYPE myrctype IS REF CURSOR; -- ...

    mysql存储过程之返回多个值的方法示例

    在本示例中,我们将探讨如何通过存储过程返回多个值,并且结合PHP进行调用。 首先,我们要明白在MySQL中,存储函数只能返回一个单一的值,而存储过程则可以处理更复杂的情况,包括返回多个值。要实现这一功能,我们...

    oracle存储过程返回游标数据集

    存储过程中通过返回数据集,通过游标方式实现,以及在java中如何接收的整个过程

    Java调用带参数的存储过程并返回集合

    4. **处理结果集**:遍历`ResultSet`,获取存储过程返回的集合数据: ```java while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); // ... 其他字段 System.out.println("ID: ...

    浅析Oracle存储过程触发器在数据同步中的应用

    存储过程是一种在数据库中预编译好的SQL程序块,它能够接受输入参数,执行一系列的数据库操作,并可能返回结果。存储过程的主要用途在于将复杂的逻辑封装起来,以便重复使用。 **2.1.2 优点** - **性能提升**:...

    存储过程的返回结果集有2中类型

    本篇将详细讨论存储过程返回结果集的两种类型:调用者(to caller)和客户应用(to client)。 首先,让我们理解这两种返回结果集类型的差异: 1. **调用者(to caller)**: 当存储过程的结果集返回给调用者时,...

    在C#中调用存储过程两种方法

    在C#中调用存储过程主要有两种方法,这两种方法都在.NET框架下被广泛使用,尤其在B/S系统中,存储过程的调用扮演了重要角色。传统的调用方式可能存在效率低、代码冗余等问题,而新的方法则在一定程度上优化了这些...

    oracle分页查询并返回总记录数据存储过程

    本文将详细介绍如何在 Oracle 中创建一个用于分页查询并返回总记录数的存储过程。 #### 核心概念 1. **存储过程**:存储在数据库中的可编程对象,可以接受参数、执行操作、返回结果。 2. **分页**:通过限制查询...

    使用OLE-DB和ADO调用返回记录集的Oracle存储过程.docx

    5. Oracle中返回记录集的存储过程的定义:在Oracle存储过程中,通过定义类型为REF CURSOR的传出参数,可以返回记录集。OLE DB允许消费者执行带REF CURSOR类型参数的PL/SQL存储过程,或者执行返回REF CURSOR的存储...

    oracle存储过程返回多行多列的结构化数组,java调用并解析

    总结来说,本示例展示了如何在Oracle存储过程中定义和使用结构化数组,以及如何在Java中调用这些存储过程并解析返回的多行多列数据。通过这种方式,你可以高效地处理复杂的数据结构,同时利用Java的灵活性来处理这些...

    存储过程导出表数据为添加语句

    在给定的`存储过程导出表数据为添加语句.sql`文件中,应该包含了创建这样一个存储过程的具体SQL代码。执行这个存储过程时,只需要提供待导出的表名作为参数,如`EXEC 存储过程名称 '表名称';`。存储过程内部会处理...

    java调用存储过程返回数组

    在Java编程中,调用数据库的存储过程并处理返回结果是常见的任务,特别是在需要执行复杂数据库操作或者封装业务逻辑时。本文将详细探讨如何在Java中调用存储过程,并处理返回的数组类型数据。 首先,存储过程是一种...

    在BIRT(百灵报表)中使用存储过程创建数据源

    在BIRT(百灵报表)中使用存储过程创建数据源是一项关键技能,尤其对于需要从数据库获取复杂数据的报表设计者来说。BIRT是一个开源的报表系统,它提供了丰富的功能来帮助用户创建、设计和展示各类报表。这篇文章将...

    使用SQLHelper类调用带输出、返回参数的存储过程

    下面,我们将深入探讨如何使用`SQLHelper`类来调用带有输出或返回参数的存储过程,这在实际项目中极为常见。 ### 1. SQLHelper 类的作用 `SQLHelper`类是.NET框架中用于封装对数据库进行各种操作的方法集合,它的...

    提取海量数据的SQL存储过程

    在大数据环境中,传统的查询方法可能无法满足性能需求,而SQL存储过程作为一种预编译的SQL代码集合,可以优化数据库操作,特别是对于复杂查询和大量数据的处理。 以下是对存储过程代码的详细解释: 1. `sp_pager` ...

Global site tag (gtag.js) - Google Analytics