--循环导入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级地址作为父地址,取其全部子地址插入进来就完事了,新插入进来的地址没有再做为父地址来用,这就是问题的所在!
想想之所以还会犯这样一个逻辑错误,还是代码敲得太少了啊。