Oracle Procedure中使用游标cursor更新多表(2008-11-17 16:02:38)转载▼标签: 杂谈
Oracle中写Procedure一直是Oracle开发中比较复杂的地方,但是掌握procedure 和cursor将使得你在Oracle开发中如鱼的水,真正体会Oracle的强大。下面通过我自己写的一个Procedure简单就procedure 和cursor的使用给一个简单的讲解和示例。
一、描述问题
我要解决的问题是使用Oracle作为数据库开发一套人力资源管理系统,在这个系统中每天员工的考勤数据是通过考勤软件每天采集考勤机的数据并存成固定格式的文本文档,有相关人员通过系统上传到数据库的attendance表中。同时数据库中的employee表记录员工信息包括工卡号 card_number。work_calen_emp表记录员工每天的工作日历明细也就是每天应该的上下班时间。考勤记录采集上传后需要更新 Work_calen_emp表中的上下班字段的数据。
二、解决思路
这是Oracle中典型的多表查询更新问题,这个问题如何解决可以看我的Blog中另一篇转载的文章《Oracle update 多表》,其中的一个方法就是使用Cursor这个方法非常灵活,适合复杂的多表查询更新。在这个Cursor的基础上必须加上更新的日期也就是要更新哪天的考勤记录。因此我写了如下的一个procedure
三、Procedure代码
create or replace procedure proc_update_wce
--1
( v_adate8 nvarchar2 ) as
--2
cursor c(c_adate8 attendance.adate8%type) is
select e.emp_id,a.card_num,a.adate8,a.atime4,a.door,m.in_out
from employee e,attendance a,atten_machine m
where e.card_number = a.card_num
and a.door = m.ma_id
and a.adate8 = c_adate8
order by e.emp_id,adate8,atime4;
--3
v c%ROWTYPE;
begin
--4
open c(v_adate8);
loop
--5
fetch c into v;
exit when c%notfound;
update work_calen_emp w
set in_time = v.atime4,
door_in = v.door
where w.emp_id = v.emp_id
and w.bmouth || w.bday = v_adate8
and v.in_out = 1;
update work_calen_emp w
set out_time = v.atime4,
door_out = v.door
where w.emp_id = v.emp_id
and w.bmouth || w.bday = v_adate8
and v.in_out = 2;
--6
end loop;
close c;
end;
四、详细讲解这个procedure
首先Oracle 创建procedure的语法是
create or replace procedure p_name
( 变量 in/out/in out 变量类型 )
as
begin
exception
end
详细的语法可以找资料看看。
1 处就是声明了一个procedure变量用于传递日期值控制更新范围。
2 处申明游标注意这个游标是带参数的因为日期值同样要传递到游标中控制游标打开数据集的范围。注意这里
and a.adate8 = c_adate8
已经将游标参数作为查询条件来限制数据集大小。
3 处 声明一个游标行类型用于存放游标中每行的数据,这里也可以一个一个变量的申明但是这样太复杂。注意语法
v c%TYPE;
%TYPE 是游标属性之一,游标属性集合可以看看相关的参考资料。常用的还有 %notfund 。
4 处显式打开游标注意这里要传递参数
open c(v_adate8);
也就是把过程参数传递给游标。
5 处开始循环并将游标结果集中一行fetch到游标变量 V 中。在这里要注意的是
exit when c%notfound;
这一句写在循环块的头部,以确保不将空数据或者重复数据更新到目标表中。
6 处结束循环并关闭游标 。
五、结束
通过这个简单的存储过程可以看到Orale开发中的灵活,掌握存储过程和游标的使用也并不难,并且能够熟练的使用可以大幅度地提高开发的效率。
分享到:
相关推荐
学习和掌握Oracle的JOB、PROCEDURE和CURSOR对于数据库管理员和开发者至关重要,它们能帮助你更高效地管理和操作数据库,实现自动化任务,并优化性能。通过阅读"oracle定时执行存储过程.pdf"和"Oracle 游标使用全解....
这种方式是通过定义一个游标(Cursor),然后遍历游标中的每一行记录,并逐一进行更新操作。具体步骤如下: 1. **定义游标**:首先定义一个游标`mycur`,用于遍历`T2`表中的所有记录。 2. **声明变量**:定义两个...
本文将详细介绍如何利用Oracle数据库中的存储过程和`DBMS_JOB`包来实现数据的自动更新与告警功能。该方案主要分为以下几个步骤: 1. **创建存储过程**:用于执行具体的业务逻辑,比如数据更新或告警条件判断。 2. *...
本文将深入探讨如何利用IBATIS提供的`procedure`标签来定义这样的操作,并通过具体的例子说明输入输出参数的配置方法。 #### 一、Procedure标签定义Statement 当需要执行一个存储过程或函数时,通常会使用`...
在Oracle中,我们可以利用ROWNUM伪列配合子查询来实现分页。 以下是一个简单的分页查询存储过程的实现步骤: 1. **创建存储过程**: 在Oracle中,创建存储过程的语法如下: ```sql CREATE OR REPLACE PROCEDURE...
在描述中提到的分表功能,我们可以利用这些特性来实现数据的分区和分布。 例如,假设我们有一个大表`large_table`,并且想要基于某个字段(如`year`)进行水平分割,创建多个子表。这可以通过以下存储过程实现: `...
然而,在开发过程中,有时我们并不知道事先要操作的具体数据库、数据表或字段,这时就需要使用动态SQL语句来实现对数据库的动态操作。本文将详细介绍如何运用动态SQL语句在PowerBuilder中实现对数据窗口的动态操作,...
以上步骤可以帮助我们有效地监控和管理SQL Server数据库中各个表的空间使用情况,这对于数据库管理员来说是非常有用的工具。通过定期执行这些脚本,可以确保数据库资源的有效利用,并有助于避免由于空间不足而导致的...
在这个例子中,`TestArray`定义为一个表,其中包含两个字段:`name`和`y`。这种定义使得我们可以灵活地管理和使用数组。 #### 总结 本文档详细介绍了如何在Oracle数据库中实现存储过程,包括创建存储过程、变量...
本压缩包"利用PLSQL实现分页查询代码.rar"主要关注的是如何在Oracle环境中通过PL/SQL来执行分页查询,这对于处理大量数据时提升性能和用户体验至关重要。 分页查询是一种在大量数据中只显示一部分(例如,每页10条...
本文将深入探讨如何利用Oracle存储过程实现数据的添加、修改、删除和查询功能。 ### 一、添加数据:存储过程实现插入 存储过程`P_EMP_INSERT`用于向`EMP`表中插入新记录。此过程接受两个参数:`V_ID`(员工编号)...
#### 分页方案一:利用Not In和SELECT TOP分页 **基本原理** 此方法的基本思路是首先获取前一页的数据集,然后从总数据集中排除这些数据,从而达到分页的效果。这种方法需要拼接SQL语句。 **Oracle实现** Oracle...
下面我们将详细介绍如何利用Oracle存储过程实现分页。 #### 创建用于分页的游标包 为了实现分页功能,我们首先需要创建一个包含游标的包(Package)。这个包将包含一个游标类型,用于返回分页结果。以下是一个简单...
在Oracle数据库中,返回多个...在存储过程中定义多个游标,然后在客户端应用程序中逐个处理这些游标,可以有效地管理和利用这些结果集。记住,正确地管理游标并确保它们在使用完毕后被关闭,以避免资源泄漏和性能问题。
### MySQL 游标在批量更新和删除中的应用详解 #### 一、MySQL 游标概述 游标(Cursor)在数据库领域中是一个重要的概念,它主要用于处理查询结果集中的每一行记录,允许开发者以逐行的方式对数据进行访问和操作。...
下面将详细介绍如何利用Oracle存储过程实现添加、修改、删除和查询操作。 ### 1. 添加数据 存储过程`P_EMP_INSERT`用于向`EMP`表中插入新记录。此过程接受两个参数:`V_ID`(员工编号)和`V_NAME`(员工姓名)。...
本文将详细介绍如何使用SQL实现分页功能,并针对三种不同的分页策略进行深入探讨:利用`Not In`和`SELECT TOP`分页;利用`ID`大于某个值与`SELECT TOP`分页;以及利用SQL的游标存储过程分页。 #### 分页方案一:...
需要注意的是,Oracle 12c及以上版本引入了更高效的CTE(公共表表达式)和`FETCH FIRST`语法,可以不用存储过程直接在SQL查询中实现分页。但如果是旧版本或者出于性能优化考虑,使用存储过程仍然是一个不错的选择。 ...
视图是从一个或多个表中选择出来的数据集,可以看作是一个虚拟表,不实际存储数据。 **特点:** - 视图以定制化的方式展示数据。 - 用户可以像查询表一样查询视图。 - 视图本身不存储数据,而是对表的查询结果。 *...
此存储过程的优势在于它可被多次调用以实现不同参数下的分页查询,具有较好的通用性和重用性。通过改变传入的页码和每页行数参数,可以灵活地在应用程序中实现动态分页功能。此外,它也支持通过in_where参数加入...