• 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 )
  • 相关阅读:
    用VS2003调试ASP的方法和体会
    InterDev 调试错误信息: Unable to set server into correct debugging state automatically....的解决办法
    如何在程序里使用代码关闭由MessageBox()弹出的对话框?
    统计数字小程序
    计数程序
    C(读入字符串,转换为int型并做加法操作)
    c数据类型简记
    define使用
    统计数字小程序
    计数程序
  • 原文地址:https://www.cnblogs.com/Sunnor/p/4819921.html
Copyright © 2020-2023  润新知