- 浏览: 250874 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
无它唯勤:
...
Spring Ioc AOP -
dubaopeng:
挺好的,拿去改改!
java 解析csv文件 -
灵程大哥:
先试一下,看行不行
java 判断文本文件编码 -
pxjianke:
谢谢兄弟。我现在在测试插入千万级数据。做测试。这个太有用了。
Oracle 高速批量速插入数据 解决方案
今天做邮件群发系统开发,遇到这样一个问题:更改数据库一条记录并返回它的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;
(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;
(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;
希望对自己和与我有一样需求的朋友,都有所帮助,在此作下符号.
发表评论
-
Oracle insert into select 序列
2010-03-16 14:46 2416"INSERT INTO AUDIT_TASK_LO ... -
Oracle 存储过程
2007-11-07 11:53 612存储过程是指数据库中已编译的可调程序,它作为PL/SQ ... -
Oracle 安装注意事项
2007-11-07 22:17 680如果你的机器上存在其它版本的Oracle,请先删除以前版本的安 ... -
Oracle 游标
2007-11-11 15:31 1505Oracle游标,从字面理解就是游动的光标。用数据库语言来描述 ... -
ORACLE 异常汇集
2007-11-15 11:53 618------------------------------- ... -
Oracle 返回 结果集
2007-12-19 19:26 700过程返回记录集: CREAT ... -
错误的
2007-12-20 19:47 559CREATE OR REPLACE PACKAGE BODY ... -
随机 返回 一条符合条件的记录
2008-01-21 10:29 711SELECT * FROM anti_shields SAMP ... -
ORACLE NOCOPY
2008-01-21 15:23 836PL/SQL中对out,in out参数使用的?默认形 ... -
ORACLE 存储过程 邮件服务器 反屏蔽
2008-01-22 12:09 702邮件群发反屏蔽的原理是这样的: 1.每封邮件内容不同( ... -
Oracle dblink
2008-02-20 14:06 627Create Database Link LinkName C ... -
让oracle做定时任务
2008-03-11 14:42 1092今天用oracle的定时任务来实现定时检测。于是goole了一 ... -
ORACL 查看连接
2008-03-14 18:16 640select schemaname,osuser,machin ... -
Oracle 常用函数
2008-03-28 14:42 6141.SUBSTR(string,start[,end]) ... -
Oracle 定时任务 JOB
2008-04-02 17:00 944众所周知,一般操作系统会提供定时执行任务的方法,例如:Uni ... -
copy表时丢失索引
2008-04-07 20:24 641今天发现了一个大问题,copy表时,会丢失索引.这导制 ... -
Oracle decode用法
2008-04-23 13:18 17171、Windows NT4.0+ORACLE 8.0.4 ... -
存储过程-a
2008-05-11 23:51 646create or replace PROCEDURE EMA ... -
存储过程-b
2008-05-11 23:52 740create or replace PROCEDURE Pro ... -
存储过程-c
2008-05-11 23:52 731create or replace Procedure Pro ...
相关推荐
如果存储过程没有返回结果,可以使用`ExecuteNonQuery`。对于查询结果,可以使用`SqlDataReader`遍历并处理每一行数据。 5. 参数传递:如果存储过程接受输入或输出参数,可以在`SqlCommand`对象中添加`SqlParameter...
在"存储过程写的增删改查"这个主题中,我们将深入探讨如何利用存储过程来实现对数据库数据的添加(Insert)、删除(Delete)、修改(Update)和查询(Select)操作。 首先,存储过程的优点包括提高性能,因为它们只...
这篇博客分享的是一个自定义的存储过程,用于批量修改Oracle序列的当前值(CURRENT VALUE)。 首先,我们需要理解Oracle序列的基本结构和操作。序列由CREATE SEQUENCE语句创建,如: ```sql CREATE SEQUENCE seq_...
在Oracle数据库环境中,存储过程是一种预编译的代码块,用于执行特定的数据库操作,如数据的添加、修改、删除和查询。它们提供了一种高效且安全的方式来处理数据,同时还可以减少网络流量并提高应用程序的性能。下面...
- 第二次UPDATE过程是在收到被叫方的180消息后,由TAS(Transit Access Switch,中继接入交换机)拦截并触发的,目的是通过多个网络元素下发给主叫方UE(User Equipment,用户设备),以便进行媒体更新,例如主叫方...
"通用存储过程+增删改查"的主题涵盖了数据库中最基础且重要的操作:插入(Insert)、删除(Delete)、更新(Update)和查询(Select)。这些操作是数据库应用开发的核心,通过存储过程实现,能提高数据处理的性能,...
在SQL Server中,存储过程被认为是一种提升性能和代码组织的有效工具。然而,有时人们发现存储过程的执行速度比直接运行SQL语句要慢,这主要归因于几个因素。 首先,存储过程的编译和缓存机制。存储过程在创建时...
在IT行业中,Delphi是一款强大的RAD(快速应用开发)工具,以其高效的编译器和对Object ...通过不断学习和实践,你可以掌握更多高级技巧,如存储过程的调用、事务处理和并发控制等,进一步提升你的数据库应用开发能力。
在实验中,学生需要学会如何调用存储过程,例如调用 addresult 存储过程来计算 l+2+3+…+n,并打印结果。 知识点八:修改存储过程 在实验中,学生需要学会如何修改存储过程,例如修改 addresult 存储过程,使得@n ...
2. **输出参数**:通过定义输出参数,存储过程可以在执行后返回结果给调用者。 3. **局部变量**:在存储过程中,可以声明并使用局部变量,以辅助处理逻辑。 4. **异常处理**:使用`DECLARE`、`BEGIN TRY`、`BEGIN ...
定义完存储过程后,使用“delimiter”关键字更改语句结束符,以便能够正确地定义存储过程或函数中的多条语句。 2. 创建函数 函数与存储过程类似,也是一种子程序。不同之处在于函数必须返回一个值。报告中并没有...
在Oracle数据库中,存储过程是一种预编译的代码块,可以接受输入参数,执行复杂的数据库操作,并返回结果或状态。本文将深入探讨如何利用Oracle存储过程实现数据的添加、修改、删除和查询功能。 ### 一、添加数据:...
本文将深入探讨如何在Asp.net中利用存储过程实现对数据库的增删改查操作。 首先,我们需要理解存储过程的概念。存储过程是一组预先编译的SQL语句,存储在数据库服务器上,可以被多次调用,减少了网络通信和解析SQL...
存储过程是数据库中一组预编译的SQL语句,它可以接收参数,执行特定任务,并返回结果。其优点包括: 1. 提高性能:存储过程在首次编译后,会缓存执行计划,多次调用时无需再次解析,从而提高执行速度。 2. 减少网络...
存储过程可以使用`RETURN`语句返回一个整数值,表示其执行状态,通常用于错误处理或状态指示。 七、存储过程的修改和删除 1. **修改**:使用`ALTER PROCEDURE`更新已存在的存储过程。 2. **删除**:使用`DROP ...
触发器是一种特殊类型的存储过程,当特定事件(如INSERT、UPDATE或DELETE)发生时自动执行。`CREATE TRIGGER` 命令用于定义这种触发行为,但由于触发器与存储过程具有不同的作用机制,因此不能在存储过程中创建...
首先,存储过程是预编译的SQL语句集合,存储在数据库服务器中,可以接受参数并返回结果。在C#中,通过ADO.NET库,我们可以调用这些存储过程以提高性能,减少网络传输,并增强安全性。存储过程可以封装复杂的业务逻辑...
在SQL中,存储过程是一种预编译的SQL语句集合,它可以封装一组操作,以便重复使用,提高数据库的效率...了解这些存储过程的工作原理和潜在风险后,我们可以根据具体需求安全地利用它们来优化数据库管理,提高开发效率。
一个分页存储过程,如`GET_EMPLOYEES_BY_PAGE`,会接受页码和每页大小作为参数,返回指定范围的记录。它通常会结合使用`ROWNUM`伪列或者Oracle 12c引入的`FETCH NEXT`子句来实现分页。 在实现这些存储过程时,我们...
- ExecuteNonQuery:用于执行不返回结果集的存储过程,如INSERT、UPDATE、DELETE等操作。 - ExecuteReader:用于执行返回多行数据的结果集的存储过程,返回一个IDataReader对象。 - ExecuteScalar:用于执行返回...