取消for循环后的一个逻辑错误

    --循环导入5-10级的子地址
    FOR V_GRADE IN 5..10
    LOOP
        IF V_GRADE<8 THEN
            INSERT INTO STG_GRIDUNIT_DP_SONSTID(GUID, GU_STDID, STDID, GRADE)
                 SELECT GG.GUID, GG.STDADDRESSID, GG.STDADDRESSID, GG.GRADE
                   FROM STG_BLD_GU_GISADDR GG
                  WHERE GG.GRADE=V_GRADE;
            COMMIT;
        END IF;

        INSERT INTO STG_GRIDUNIT_DP_SONSTID(GUID, GU_STDID, STDID, GRADE)
             SELECT G1.GUID, G1.GU_STDID, AG.ID, V_GRADE
               FROM STG_ADDR_GIS AG, STG_GRIDUNIT_DP_SONSTID G1
              WHERE AG.PARENTID=G1.STDID
                AND G1.GRADE=V_GRADE-1;
        COMMIT;
    END LOOP;

 

看到这段代码,想想这里用for循环就是浪费时间,完全可以去掉的嘛,于是就修改了。当然,还是得谨慎一点,修改前记录下表里的数据量。修改后如下:

  INSERT INTO STG_GRIDUNIT_DP_SONSTID(GUID, GU_STDID, STDID, GRADE)
       SELECT GG.GUID, GG.STDADDRESSID, GG.STDADDRESSID, GG.GRADE
         FROM STG_BLD_GU_GISADDR GG
        WHERE GG.GRADE IN (5,6,7);
  COMMIT;

  INSERT INTO STG_GRIDUNIT_DP_SONSTID(GUID, GU_STDID, STDID, GRADE)
       SELECT G1.GUID, G1.GU_STDID, AG.ID, AG.GRADE
         FROM STG_ADDR_GIS AG, STG_GRIDUNIT_DP_SONSTID G1
        WHERE AG.PARENTID=G1.STDID
          AND G1.GRADE IN (4,5,6,7,8,9);
  COMMIT;

测试下这回跑完用的时间是上次的一半,想想应该成功了吧,但是检查下数据情况后才发现出现了问题:数据量比之前少了很多!

一开始根本就没反应过来,想着这改动应该完全是没问题的啊,就是前面实现的另一种表述罢了,可是实际结果却并没有按照我的意思,那还是老实的找找原因吧。

经过一番苦思冥想,终于发现问题所在了:就出在这个for循环上!前面的一段insert 改动当然是没有问题的,可是后面的就不同了。之前是从自己这个表开始,将其里面的4级地址作为父地址,然后找到下面所有的子地址插入表内,再将之前表里就有的5级地址和新插入进来的5级地址作为父地址,取其全部子地址再插入进来,依次类推,只至第9级地址。而更改后的情况却是,将本表里的4到9级地址作为父地址,取其全部子地址插入进来就完事了,新插入进来的地址没有再做为父地址来用,这就是问题的所在!

想想之所以还会犯这样一个逻辑错误,还是代码敲得太少了啊。

你可能感兴趣的:(insert,测试,Oracle)