这个问题困扰了我们组的很多人。不知道这边有没有人可以提些意见帮忙解决?
以下存储过程从程序上看没什么问题,但是我来描述 一下问题:
1)TA723008 简称A表,TA723003_prepare简称B表。
2)A表里面有4千万条以上的数据,B表里面有1万条以上的数据,现在要对A表的某字段更新,匹配条件是A表中的日期为20071231之前的。然后就是拿A表中的某个字段去关联B表的字段,得到B表中的中文名然后更新到A表中去。
可是因为客观原因,不可能让一个存储过程跑一个晚上还在更新,因为按照以下的程序是一个笛卡尔乘积,拿一个表的全表扫描去匹配另一个表的全表扫描。
3)程序详解:逐条更新,然后通过计数器每更新1万条就commit一次。
希望有人能提出有建设性的方案来解决笛卡尔乘积 然后又能满足以上所说功能。不甚感激!!!!
PROCEDURE R_MOVE_TA723008(OI_FLAG OUT INTEGER, --0 成功, -1 失败
OS_MESG OUT VARCHAR2 --出错详细信息
) IS
VI_COUNT INTEGER := 0; --计数器
VI_COUNT_all INTEGER := 0; --计数器
CURSOR CUR_TA723008 IS
SELECT ROWID, T.*
FROM BIFT.TA723008 T
WHERE T.TA723008002 <= '20071231'
AND t.ta723008015 IS NULL;
BEGIN
OI_FLAG := 0;
OS_MESG := '更新开始';
FOR VT_TA723008 IN CUR_TA723008 LOOP
UPDATE TA723008
SET TA723008015 = (SELECT TA723003007
FROM TA723003_PREPARE
WHERE TA723003_PREPARE.TA723003005 = TA723008009
AND ROWNUM = 1)
WHERE TA723008.ROWID = VT_TA723008.ROWID;
VI_COUNT := VI_COUNT + 1;
VI_COUNT_all := VI_COUNT_all + 1;
IF (VI_COUNT >= 10000) THEN
COMMIT;
VI_COUNT := 0;
END IF;
END LOOP;
OI_FLAG := 0;
OS_MESG := '更新结束';
COMMIT;
EXCEPTION
WHEN OTHERS THEN
OI_FLAG := 1;
OS_MESG := SUBSTRB(OS_MESG || '时出错! 错误代码:' || SQLCODE || ',错误信息:' ||
SQLERRM,
1,
400);
RETURN;
END R_MOVE_TA723008;
1)TA723008 简称A表,TA723003_prepare简称B表。
2)A表里面有4千万条以上的数据,B表里面有1万条以上的数据,现在要对A表的某字段更新,匹配条件是A表中的日期为20071231之前的。然后就是拿A表中的某个字段去关联B表的字段,得到B表中的中文名然后更新到A表中去。
可是因为客观原因,不可能让一个存储过程跑一个晚上还在更新,因为按照以下的程序是一个笛卡尔乘积,拿一个表的全表扫描去匹配另一个表的全表扫描。
3)程序详解:逐条更新,然后通过计数器每更新1万条就commit一次。
希望有人能提出有建设性的方案来解决笛卡尔乘积 然后又能满足以上所说功能。不甚感激!!!!
PROCEDURE R_MOVE_TA723008(OI_FLAG OUT INTEGER, --0 成功, -1 失败
OS_MESG OUT VARCHAR2 --出错详细信息
) IS
VI_COUNT INTEGER := 0; --计数器
VI_COUNT_all INTEGER := 0; --计数器
CURSOR CUR_TA723008 IS
SELECT ROWID, T.*
FROM BIFT.TA723008 T
WHERE T.TA723008002 <= '20071231'
AND t.ta723008015 IS NULL;
BEGIN
OI_FLAG := 0;
OS_MESG := '更新开始';
FOR VT_TA723008 IN CUR_TA723008 LOOP
UPDATE TA723008
SET TA723008015 = (SELECT TA723003007
FROM TA723003_PREPARE
WHERE TA723003_PREPARE.TA723003005 = TA723008009
AND ROWNUM = 1)
WHERE TA723008.ROWID = VT_TA723008.ROWID;
VI_COUNT := VI_COUNT + 1;
VI_COUNT_all := VI_COUNT_all + 1;
IF (VI_COUNT >= 10000) THEN
COMMIT;
VI_COUNT := 0;
END IF;
END LOOP;
OI_FLAG := 0;
OS_MESG := '更新结束';
COMMIT;
EXCEPTION
WHEN OTHERS THEN
OI_FLAG := 1;
OS_MESG := SUBSTRB(OS_MESG || '时出错! 错误代码:' || SQLCODE || ',错误信息:' ||
SQLERRM,
1,
400);
RETURN;
END R_MOVE_TA723008;
...全文
相关推荐
cad插件替代启动组-只需拖拽一次永久解决插件加载问题
总结来说,通过“cad插件替代启动组”和“插件系列”自动化加载插件小工具最终版,用户能够有效地解决CAD插件加载的问题,提升工作效率,减少因插件管理不当引发的困扰。
PADS解决菜单显示不全问题
在使用PADS 9.5这款强大的PCB设计软件时,有时用户可能会遇到菜单显示不全的困扰。这个问题通常是由于软件兼容性、系统设置或显示配置导致的。
目的为了给学opengl的人不被环境困扰。_LearnOpenglEmpty.zip
不过,根据标题和描述中的“LearnOpenGL”以及“不被环境困扰”的关键词,可以推测这个压缩包可能是为初学者准备的一个简化的OpenGL学习环境。
破解招聘困扰提升招聘绩效20220803参考.pdf
在破解招聘困扰提升招聘绩效的过程中,企业面临着多重挑战。首先,案例中提到的NTT化学公司的招聘案例展示了在实际操作中可能出现的问题。
IDEA2020 1.1中Plugins加载不出来的问题及解决方法
"IDEA2020 1.1中Plugins加载不出来的问题及解决方法"本文将详细介绍IDEA2020 1.1中Plugins加载不出来的问题,并提供相应的解决方法。


