Oracle 游标疑问

procedure1:

 1 CREATE OR REPLACE PROCEDURE UPDATE_AC02_AAE140_WYL(PI_AAB001 IN NUMBER,
 2                                                    PO_FHZ    OUT VARCHAR2,
 3                                                    PO_MSG    OUT VARCHAR2) IS
 4   V_AAZ159 NUMBER(20);
 5   --说明:以养老参保的情况为标准(即ac02为准),添加aae140 = 410,510的险种
 6   --20150919 wyl
 7
 8 BEGIN
 9   --1 清空 备份表1
10   DELETE FROM AC02_WYL;
11   --2 往备份表1里 插入 ac02中险种为110的数据
12   INSERT INTO AC02_WYL
13     SELECT *
14       FROM AC02
15      WHERE AAB001 = PI_AAB001
16        AND AAE140 = ‘110‘;
17   --3 以备份表1养老 为 参照,往备份表2中插如110数据,是用来生成 510 险种的
18   INSERT INTO AC02_WYL_2
19     SELECT * FROM AC02_WYL WHERE AAE140 = ‘110‘;
20   --4 以备份表2 中的 110为参照,更新为 510险种
21   UPDATE AC02_WYL_2
22      SET AAE140 = ‘510‘, AAE201 = 0, CAC014 = 201509
23    WHERE AAB001 = PI_AAB001
24      AND AAE140 = ‘110‘;
25   --5 以备份表1的养老 为 参照,往备份表2中插如110数据,是用来生成 410 险种的 同步骤3
26   INSERT INTO AC02_WYL_2
27     SELECT * FROM AC02_WYL WHERE AAE140 = ‘110‘;
28   --6 以备份表2 中的 110为参照,更新为 410险种  同步骤4
29   UPDATE AC02_WYL_2
30      SET AAE140 = ‘410‘, AAE201 = 0, CAC014 = 201509
31    WHERE AAB001 = PI_AAB001
32      AND AAE140 = ‘110‘;
33   --7循环 ,主要是修改 aaz159,
34   --调用 procedure UPDATE_AC02_AAE140_WYL_xh
35   UPDATE_AC02_AAE140_WYL_XH(pi_aab001);
36 END;

UPDATE_AC02_AAE140_WYL_XH:

 1 CREATE OR REPLACE PROCEDURE UPDATE_AC02_AAE140_WYL_XH(PI_AAB001 VARCHAR2) IS
 2   V_AAZ159 NUMBER(20);
 3   CURSOR C_AC02_WYL IS
 4     SELECT * FROM AC02_WYL_2 WHERE AAB001 = PI_AAB001;
 5 BEGIN
 6   FOR V_C_AC02_WYL IN C_AC02_WYL LOOP
 7     SELECT SEQ_BXGX_AAZ159.NEXTVAL INTO V_AAZ159 FROM DUAL;
 8     UPDATE AC02_WYL_2 SET AAZ159 = V_AAZ159;
 9   END LOOP;
10 END;

最后导入到ac02_wyl_2的数据的aaz159竟然都是同一个值。应该是loop的时候的某个步骤弄错了。

第二个过程改后就没问题了,改后的如下:

 1 CREATE OR REPLACE PROCEDURE UPDATE_AC02_AAE140_WYL_XH(PI_AAB001 VARCHAR2) IS
 2   V_AAZ159 NUMBER(20);
 3   CURSOR C_AC02_WYL IS
 4     SELECT * FROM AC02_WYL_2 WHERE AAB001 = PI_AAB001;
 5 BEGIN
 6   FOR V_C_AC02_WYL IN C_AC02_WYL LOOP
 7     SELECT SEQ_BXGX_AAZ159.NEXTVAL INTO V_AAZ159 FROM DUAL;
 8     UPDATE AC02_WYL_2
 9        SET AAZ159 = V_AAZ159
10      WHERE AAZ159 = V_C_AC02_WYL.AAZ159
11        AND AAB001 = PI_AAB001;
12   END LOOP;
13 END;

之前错误的数据导致aaz159都是用一个号,

ac02_wyl_2的具体数据如下图:

附ac02的建表sql:

 1 create table AC02
 2 (
 3   aaz159 NUMBER(20) not null,
 4   bae001 VARCHAR2(14) not null,
 5   aab001 NUMBER(20),
 6   aac001 NUMBER(20) not null,
 7   aae140 VARCHAR2(6) not null,
 8   aac013 VARCHAR2(6),
 9   cac013 VARCHAR2(6),
10   aaa095 VARCHAR2(6) not null,
11   aac008 VARCHAR2(6) not null,
12   aac049 NUMBER(6) not null,
13   cac014 NUMBER(8),
14   aae201 NUMBER(4) not null,
15   aaz099 NUMBER(20),
16   aac048 NUMBER(6)
17 )
时间: 2024-08-17 10:32:05

Oracle 游标疑问的相关文章

[转载]oracle游标概念讲解

原文URL:http://www.2cto.com/database/201203/122387.html ORACLE游标概念讲解 什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互的机制.      ②关系数据库中的操作是在完整的行集合上执行的.   由SELECT 语句返回的行集合包括满足该语句的WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.      应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的.      这些

Duang!危险的oracle游标

1.引言 SQL是面向集合的语言,其结果一般是集合量(含多条记录),而pl/sql的变量是标量,一组变量一次只能存放一条记录.很多时候查询结果的记录数是不确定的,无法提前声明足够的变量.于是引入了游标的概念,游标使得数据库操作更灵活,但同时也给黑客入侵数据库带来了机会.安华金和数据库安全实验室(DBSec Labs)基于游标的应用原理,本文讨论游标可能带来什么安全隐患以及如何应对这些安全隐患. 2.游标的分类 oracle数据库游标是Pl/sql执行DQL.DML等语句的时候,oracle在内存

oracle 游标例子

CREATE OR REPLACE PROCEDURE PRC_WAP_ACTIVEUSERS(RETCODE OUT VARCHAR2) /*********************************************************** * 功能:WAP指标--活跃用户统计(分批提交) * 参数:RETCODE(返回编码:0000成功) * 作者: * 创建时间:2013-01-16 * 版本:1.0 * 修改人: * 修改时间: ********************

【翻译】Oracle游标详细说明

这篇文章是选取官方文档的部分章节翻译过来的,去除了原文中的例子,并在结尾补充了几个例子.有兴趣的朋友可以点击文章末尾的连接去阅读官方文档. 一.游标的定义 游标是指向专用SQL区域的指针,该区域存储有关处理特定SELECT或DML语句的信息.本章解释的游标是会话游标.会话游标存在于会话中直到会话结束.由PL/SQL创建和管理的游标称为隐式游标,由用户创建和管理的游标称为显式游标.你可以通过游标的属性获取任意会话游标的相关信息.通过查询动态性能视图V$OPEN_CURSOR,可以列出当前已经打开和

Oracle游标—for、loop、if结合应用

一.需求 什么时候会用到Oracle游标,以及其中的for.loop.if呢? 先看这样一个需求: 有一张学生授课表T_TEACHING,每个学生都有数门课程: 主键ID(自增) 课程号COURSE_ID 学号USER_ID 1 01 201501 2 02 201501 3 03 201501 4 01 201502 5 01 201503 6 01 201504 7 02 201504 ... ... ... 但是因为某些原因,导致有的学生课程不全(本应该每个学生都有3门课),应该如何把不全

Oracle游标循环更新数据案例

declare v_XTXMBH number; v_ZJZJZJRQ varchar2(40); cursor c_job is SELECT XT.XTXMBH AS XTXMBH, QJ.ZJZJZJRQ AS ZJZJZJRQ FROM XTXMXX XT, QJGLXX_ZQL_MID QJ WHERE XT.XTXMBH = QJ.XTXMBH AND XT.XTXMCLRQ >= '20120630' AND (QJ.ZJQHZJRQ IS NULL OR QJ.ZJZJZJRQ

oracle游标小试

有时候需要大面积的修改数据,这个时候用循环语句效率不高.而临时表又不能满足点对点修改的时候,游标似一种不错的选择(PS:好像游标也是为循环而生的吧) 现在有两张表 t1(ryid number,name nvarchar2(50),salary number,paydate date……)用来存员工每月的工资 t2(ryid number,paySalary number)每个月发的工资数目 现将t2中的paySalary添加到t1中 可以直接用update来实现: 现用oracle的for游标

Oracle 游标示例,带异常处理

Oracle游标示例一则,带异常处理. DECLARE CURSOR c_dl IS SELECT ID, NSRSBH, WSPZXH, ZXYY_DM, HZRQ, SWJG_DM, GXSJ FROM T_GUOS_ZXXX WHERE gxsj > begin_gxsj; c_row c_dl%ROWTYPE; BEGIN FOR c_row IN c_dl LOOP BEGIN IF (c_row.GXSJ > max_gxsj) THEN BEGIN max_gxsj := c_r

Oracle游标-循环查询表中数据(表名),并执行

Oralce 表中存有一个字段,该字段存储表名,要把该表中的所有表名查询出来(即表名结果集),且执行结果集from 表名结果集: declare v_ccount varchar2(100); --定义一个游标变量 cursor c_job is --查询该表中的所有表名 select tablename from tbname; c_row c_job%rowtype; begin --循环待处理数据,即以上查出的结果集 for c_row in c_job loop ---执行语句 from