`
hwpok
  • 浏览: 250874 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

存储过程 Update 返回改更后的 结果

SQL 
阅读更多

    今天做邮件群发系统开发,遇到这样一个问题:更改数据库一条记录并返回它的id.
    下面记录我的思维过程:
方法一:
    1.先select ...for update的方式找出这条记录,同时将它锁定;
    2.再根据id update 该条记录;
    3.最后返回该条记录的id;
    这种方法的存储过程如下:

CREATE OR REPLACE PROCEDURE backtrack_task_Id
    (in_status_will_sending 
IN NUMBER,
     in_status_now_sending 
IN NUMBER,
     in_fixed_sending 
IN NUMBER,
     out_taskId OUT 
NUMBER)
     
AS
         temp_task_id 
NUMBER;
         update_number 
NUMBER;
     
BEGIN 
         
IF in_fixed_sending = 1 THEN
             
SELECT id 
               
INTO temp_task_id 
             
FROM tasks 
             
WHERE status = in_status_will_sending 
               
AND SYSDATE >= send_date 
               
AND ROWNUM < 2 FOR UPDATE;
          
ELSE
            
SELECT id 
              
INTO temp_task_id 
            
FROM tasks 
            
WHERE status = in_status_will_sending 
              
AND ROWNUM < 2 FOR UPDATE;
          
END IF;
          
IF temp_task_id IS NOT NULL THEN
              
UPDATE tasks 
                
SET status = in_status_now_sending 
              
WHERE id = temp_task_id 
                
AND status = in_status_will_sending;
              update_number :
= SQL % ROWCOUNT;
          
END IF;
          
IF update_number = 1 THEN
              out_taskId :
= temp_task_id;
          
ELSE
          out_taskId :
= -1;
          
END IF;
         EXCEPTION 
              
WHEN NO_DATA_FOUND THEN
                out_taskId :
= -1;
        
END backtrack_task_Id;

方法二:
    update的同时返回该条记录的信息(id)
    这种方法的存储过程如下:

CREATE OR REPLACE PROCEDURE backtrack_taskId
  (in_status_will_sending 
IN NUMBER,
   in_status_now_sending 
IN NUMBER,
   in_fixed_sending 
IN NUMBER,
   out_taskId OUT 
NUMBER)
    
AS
        temp_task_id 
NUMBER;
    
BEGIN
        
IF in_fixed_sending = 1 THEN
            
UPDATE tasks
               
SET status = in_status_now_sending
             
WHERE status = in_status_will_sending
               
AND SYSDATE >= send_date
               
AND ROWNUM < 2
            RETURNING id 
INTO temp_task_id;
        
ELSE
            
UPDATE tasks
               
SET status = in_status_now_sending
             
WHERE status = in_status_will_sending
               
AND ROWNUM < 2
                RETURNING id INTO temp_task_id;
        
END IF;
        out_taskId :
= temp_task_id;
    
END backtrack_taskId;

希望对自己和与我有一样需求的朋友,都有所帮助,在此作下符号.
 

分享到:
评论

相关推荐

    asp.net存储过程 增删改查对存储过程超作

    如果存储过程没有返回结果,可以使用`ExecuteNonQuery`。对于查询结果,可以使用`SqlDataReader`遍历并处理每一行数据。 5. 参数传递:如果存储过程接受输入或输出参数,可以在`SqlCommand`对象中添加`SqlParameter...

    存储过程写的增删改查

    在"存储过程写的增删改查"这个主题中,我们将深入探讨如何利用存储过程来实现对数据库数据的添加(Insert)、删除(Delete)、修改(Update)和查询(Select)操作。 首先,存储过程的优点包括提高性能,因为它们只...

    批量修改Oracle序列值的存储过程

    这篇博客分享的是一个自定义的存储过程,用于批量修改Oracle序列的当前值(CURRENT VALUE)。 首先,我们需要理解Oracle序列的基本结构和操作。序列由CREATE SEQUENCE语句创建,如: ```sql CREATE SEQUENCE seq_...

    ORACLE存储过程实现添加、修改、删除、查询

    在Oracle数据库环境中,存储过程是一种预编译的代码块,用于执行特定的数据库操作,如数据的添加、修改、删除和查询。它们提供了一种高效且安全的方式来处理数据,同时还可以减少网络流量并提高应用程序的性能。下面...

    VOLTE呼叫建立过程中的UPDATE含义及过程分析.pdf

    - 第二次UPDATE过程是在收到被叫方的180消息后,由TAS(Transit Access Switch,中继接入交换机)拦截并触发的,目的是通过多个网络元素下发给主叫方UE(User Equipment,用户设备),以便进行媒体更新,例如主叫方...

    通用存储过程+增删改查

    "通用存储过程+增删改查"的主题涵盖了数据库中最基础且重要的操作:插入(Insert)、删除(Delete)、更新(Update)和查询(Select)。这些操作是数据库应用开发的核心,通过存储过程实现,能提高数据处理的性能,...

    SQL Server中存储过程比直接运行SQL语句慢的原因

    在SQL Server中,存储过程被认为是一种提升性能和代码组织的有效工具。然而,有时人们发现存储过程的执行速度比直接运行SQL语句要慢,这主要归因于几个因素。 首先,存储过程的编译和缓存机制。存储过程在创建时...

    Delphi通过update语句修改数据库内容..rar

    在IT行业中,Delphi是一款强大的RAD(快速应用开发)工具,以其高效的编译器和对Object ...通过不断学习和实践,你可以掌握更多高级技巧,如存储过程的调用、事务处理和并发控制等,进一步提升你的数据库应用开发能力。

    实验八 存储过程的使用(学生).doc

    在实验中,学生需要学会如何调用存储过程,例如调用 addresult 存储过程来计算 l+2+3+…+n,并打印结果。 知识点八:修改存储过程 在实验中,学生需要学会如何修改存储过程,例如修改 addresult 存储过程,使得@n ...

    数据库的存储过程

    2. **输出参数**:通过定义输出参数,存储过程可以在执行后返回结果给调用者。 3. **局部变量**:在存储过程中,可以声明并使用局部变量,以辅助处理逻辑。 4. **异常处理**:使用`DECLARE`、`BEGIN TRY`、`BEGIN ...

    MySQL实验报告5(存储过程与函数)(1)(1).pdf

    定义完存储过程后,使用“delimiter”关键字更改语句结束符,以便能够正确地定义存储过程或函数中的多条语句。 2. 创建函数 函数与存储过程类似,也是一种子程序。不同之处在于函数必须返回一个值。报告中并没有...

    ORACLE如何使用存储过程实现添加、修改、删除、查询

    在Oracle数据库中,存储过程是一种预编译的代码块,可以接受输入参数,执行复杂的数据库操作,并返回结果或状态。本文将深入探讨如何利用Oracle存储过程实现数据的添加、修改、删除和查询功能。 ### 一、添加数据:...

    Asp.net利用存储过程操作数据库(增删改查)

    本文将深入探讨如何在Asp.net中利用存储过程实现对数据库的增删改查操作。 首先,我们需要理解存储过程的概念。存储过程是一组预先编译的SQL语句,存储在数据库服务器上,可以被多次调用,减少了网络通信和解析SQL...

    数据库实验报告-存储过程、触发器

    存储过程是数据库中一组预编译的SQL语句,它可以接收参数,执行特定任务,并返回结果。其优点包括: 1. 提高性能:存储过程在首次编译后,会缓存执行计划,多次调用时无需再次解析,从而提高执行速度。 2. 减少网络...

    sqlsever存储过程

    存储过程可以使用`RETURN`语句返回一个整数值,表示其执行状态,通常用于错误处理或状态指示。 七、存储过程的修改和删除 1. **修改**:使用`ALTER PROCEDURE`更新已存在的存储过程。 2. **删除**:使用`DROP ...

    不能在存储过程中使用的语句

    触发器是一种特殊类型的存储过程,当特定事件(如INSERT、UPDATE或DELETE)发生时自动执行。`CREATE TRIGGER` 命令用于定义这种触发行为,但由于触发器与存储过程具有不同的作用机制,因此不能在存储过程中创建...

    C#利用存储过程实现的 增加,删除,修改

    首先,存储过程是预编译的SQL语句集合,存储在数据库服务器中,可以接受参数并返回结果。在C#中,通过ADO.NET库,我们可以调用这些存储过程以提高性能,减少网络传输,并增强安全性。存储过程可以封装复杂的业务逻辑...

    sql 万能修改,删除表的存储过程

    在SQL中,存储过程是一种预编译的SQL语句集合,它可以封装一组操作,以便重复使用,提高数据库的效率...了解这些存储过程的工作原理和潜在风险后,我们可以根据具体需求安全地利用它们来优化数据库管理,提高开发效率。

    oracle 增加,删除,修改和分页存储过程

    一个分页存储过程,如`GET_EMPLOYEES_BY_PAGE`,会接受页码和每页大小作为参数,返回指定范围的记录。它通常会结合使用`ROWNUM`伪列或者Oracle 12c引入的`FETCH NEXT`子句来实现分页。 在实现这些存储过程时,我们...

    sqlhelper调用存储过程.rar

    - ExecuteNonQuery:用于执行不返回结果集的存储过程,如INSERT、UPDATE、DELETE等操作。 - ExecuteReader:用于执行返回多行数据的结果集的存储过程,返回一个IDataReader对象。 - ExecuteScalar:用于执行返回...

Global site tag (gtag.js) - Google Analytics