最近在项目中做了一个关于系统与系统之间数据同步的业务,之前使用jndi远程调用的方式实现了这个同步功能,但总是感觉速度很慢,而且很不稳定,现将其修改成dblink+存储过程方式,特对存储过程及游标做了相应学习,此处主要记录游标及循环的不同使用方法:
第一种方式: FOR ... IN .....LOOP....END LOOP
CREATE OR REPLACE PROCEDURE synchronous_material
IS
last_version VARCHAR2(14); --------此处注意,别忘了长度的定义
sync_row GZB_EPMS_material%ROWTYPE; ---用这种方式,此处的sync_row也可不定义
BEGIN
SELECT last_SYNCHRONOUS_TIME INTO last_version FROM (SELECT (to_char(SYNCHRONOUS_TIME,'yyyymmddhhmiss')) AS last_SYNCHRONOUS_TIME FROM ... ORDER BY SYNCHRONOUS_TIME DESC) WHERE ROWNUM <= 1;
-----此处本来应该加EXCEPTION WHEN DATA_NOT_FOUND THEN ...;但我的这个业务不会出现找不到数据,所以省略了
IN ( ----此处的sync_row迭代变量可以不用事先在IS中定义
SELECT ......
FROM ... WHERE OBJVERSION > last_version AND OBJVERSION <= to_char(SYSDATE,'yyyymmddhhmiss')
UNION
SELECT ..... FROM ....WHERE OBJVERSION > last_version AND OBJVERSION <= to_char(SYSDATE,'yyyymmddhhmiss')
) LOOP
NULL; ---此处是语句体,省略;
END LOOP;
RETURN;
END synchronous_material;
第二种方式:CURSOR
1,CURSOR + WHILE...LOOP...END LOOP
CREATE OR REPLACE PROCEDURE synchronous_material
IS
last_version VARCHAR2(14);
CURSOR cur_sync(begin_objversion VARCHAR2,end_objversion VARCHAR2)
IS
SELECT ..... FROM ......WHERE OBJVERSION > begin_objversion AND
OBJVERSION <= end_objversion
UNION
SELECT ....FROM ......WHERE OBJVERSION > begin_objversion AND
OBJVERSION <= end_objversion;
BEGIN
SELECT last_SYNCHRONOUS_TIME INTO last_version FROM
(SELECT (to_char (SYNCHRONOUS_TIME,'yyyymmddhhmiss'))
AS last_SYNCHRONOUS_TIME FROM ...... ORDER BY SYNCHRONOUS_TIME DESC)
WHERE ROWNUM <= 1;
OPEN cur_sync(last_version,to_char(SYSDATE,'yyyymmddhhmiss'));
WHILE cur_sync%FOUND LOOP
NULL;
END LOOP;
LOSE cur_sync;
END synchronous_material;
2,CURSOR +FOR 变量名 IN 游标名 LOOP....END LOOP
CREATE OR REPLACE PROCEDURE synchronous_material
IS
last_version VARCHAR2(14);
CURSOR cur_sync(begin_objversion VARCHAR2,end_objversion VARCHAR2)
IS
SELECT ..... FROM ......WHERE OBJVERSION > begin_objversion AND
OBJVERSION <= end_objversion
UNION
SELECT ....FROM ......WHERE OBJVERSION > begin_objversion AND
OBJVERSION <= end_objversion;
sync_row GZB_EPMS_material%ROWTYPE;
BEGIN
SELECT last_SYNCHRONOUS_TIME INTO last_version FROM
(SELECT (to_char (SYNCHRONOUS_TIME,'yyyymmddhhmiss'))
AS last_SYNCHRONOUS_TIME FROM ...... ORDER BY SYNCHRONOUS_TIME DESC)
WHERE ROWNUM <= 1;
OPEN cur_sync(last_version,to_char(SYSDATE,'yyyymmddhhmiss'));
FOR sync_row IN cur_sync(last_version,to_char(SYSDATE,'yyyymmddhhmiss')) LOOP
NULL;
END LOOP;
CLOSE cur_sync;
END synchronous_pm_t_material;
分享到:
相关推荐
存储过程调用 Function 并使用 游标循环得到每一条数据然后更新本条数据。初学代码写的不是很好,希望能给初学存储过程的兄弟们提供一点借鉴哦。
第一章 oracle存储过程概述 2 1.1 存储过程基本结构(PROCEDURE) 3 1.1.1创建存储过程 3 1.1.2 存储过程删除 5 1.1.3 调用存储过程 5 1.2存储函数(FUNCTIONE) 6 1.2.1 创建存储函数 6 1.2.2 删除存储函数 7 1.3 包...
oracle数据库存储过程相关知识简介,存储过程创建语法讲解,包括判断语句、循环、数组遍历、游标使用,后附实例
本文实例讲述了Oracle出现超出打开游标最大数的解决方法。分享给大家供大家参考,具体如下: Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。...
缺点:滥用触发器会造成数据库及应用程序的维护困难。 (5)触发器的两种形式(行级触发器,表级触发器) 1.在语法上,行级触发器就多了一句话:for each row 2.在表现上,行级触发器,在每一行的数据进行操作的...
①:存储过程 ②:函数 ③:自主事务处理 ④:包规范|包主体 十一.触发器|内置包 ①:触发器类型 ②:触发器原理 ③:new和old 两个行类型变量 ④:递归 ⑤:内置包 十二.导入导出 ①:导入导出/整个DB/表空间/表/...
5.7 如何创建存储过程以及创建存储过程的原因 146 5.8 函数的创建和使用 149 5.9 调用PL/SQL程序 151 5.10 本章测验 152 第6章 数据库管理员 153 6.1 了解DBA的工作 154 6.2 执行日常操作 154 6.2.1 体系结构...
5.7 如何创建存储过程以及创建存储过程的原因 5.8 函数的创建和使用 5.9 调用PL/SQL程序 5.10 本章 测验 第6章 数据库管理员 6.1 了解DBA的工作 6.2 执行日常操作 6.2.1 体系结构和设计 6.2.2 容量规划 6.2.3 备份...
15.5.2 Oracle中存储过程和函数的管理 第16章 SQL触发器 16.1 触发器的基本概念 16.1.1 触发器简介 16.1.2 触发器执行环境 16.2 SQL Server中的触发器 16.2.1 SQL Server触发器的种类 16.2.2 ...
目录 Oracle教程 1 一、 为什么要学习Oracle 8 二、 Oracle公司 8 三、 Oracle安装、启动及缷载 9 3.1. 安装 9 3.2. Oracle的卸载、删除 9 ...25.2. 存储过程 229 25.3. 函数 236 25.4. 程序包 240 25.5. 触发器 243
Oracle数据库的应用系统结构 11 七. 补充资料——oracle安装时出现的问题 12 第二讲 Oacle数据库体系结构 14 一. 物理存储结构——(数据库载体) 14 1.数据文件(.DBF) 14 2.日志文件 (.Log) 14 1) 日志文件 ...
15.5.2 oracle中存储过程和函数的管理 324 第16章 sql触发器 325 16.1 触发器的基本概念 325 16.1.1 触发器简介 325 16.1.2 触发器执行环境 325 16.2 sql server中的触发器 326 16.2.1 sql server触发器的种类...
涉及到SQLServer2000、SQLServer2005、Access、Oracle10g、MySql5.0和Postgresql8.2等6种数据库语言,内容包括SQL语言基础、常规数据查询、高级数据过滤、字符串查询、日期函数、日期函数、数据排序、聚集函数与分组...
涉及到SQLServer2000、SQLServer2005、Access、Oracle10g、MySql5.0和Postgresql8.2等6种数据库语言,内容包括SQL语言基础、常规数据查询、高级数据过滤、字符串查询、日期函数、日期函数、数据排序、聚集函数与分组...
1.在全局存储区SGA中,哪部分内存区域是循环使用的?( B ) A.数据缓冲区 B.日志缓冲区 C. 共享池 D.大池 2.如果一个服务器进程非正常终止,Oracle系统将使用下列哪一个进程来释放它所占用的资源?( D ) ...
涉及到SQLServer2000、SQLServer2005、Access、Oracle10g、MySql5.0和Postgresql8.2等6种数据库语言,内容包括SQL语言基础、常规数据查询、高级数据过滤、字符串查询、日期函数、日期函数、数据排序、聚集函数与分组...
涉及到SQLServer2000、SQLServer2005、Access、Oracle10g、MySql5.0和Postgresql8.2等6种数据库语言,内容包括SQL语言基础、常规数据查询、高级数据过滤、字符串查询、日期函数、日期函数、数据排序、聚集函数与分组...
1. Oracle应用编辑方法概览 1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和数据库打交道的方法,和Pro*C很相似,更底层,很少用 只适合ORACLE; 4) SQLJ: 很新的一种用...
实验41:编写存储过程 83 实验42:编写包package 85 第三部分数据库的体系结构 88 实例的维护 88 实验43:数据库的最高帐号sys的操作系统认证模式 90 实验44:数据库的最高帐号sys的密码文件认证模式 92 实验45:...
通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中可以使用create procedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来...