oracle存储过程中insert语句性能如何调优?

layznet 2010-08-26 08:03:34
功能:根据给定的文件名和要插入的记录数N,在表中插入N条记录,其中N甚至会超过1亿。

CREATE OR REPLACE PROCEDURE INSERT_REPORT(
FILE_NAME VARCHAR2,
LINE_NO NUMBER) IS
CURRENT_NO NUMBER := 0;
BEGIN
DELETE FROM T_USER_REPORT;
CURRENT_NO := CURRENT_NO+1;
WHILE CURRENT_NO<=LINE_NO LOOP
INSERT INTO T_USER_REPORT(FILENAME,LINENO,COLUMNNO,RESULTCODE) VALUES(FILE_NAME,CURRENT_NO,0,'00');
CURRENT_NO := CURRENT_NO+1;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END INSERT_REPORT;

这段存储过程如何优化,才能使插入数据更快,性能更好呢?我想到使用类似JDBC中PreparedStatement,但是在存储过程中又不知如何操作。
...全文
215 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
studentaccp 2010-08-26
  • 打赏
  • 举报
回复
尽可能多的commit 多释放资源
碧水幽幽泉 2010-08-26
  • 打赏
  • 举报
回复
关注!
orbcle 2010-08-26
  • 打赏
  • 举报
回复
用批量提交,具体的业务你再完善一下

CREATE OR REPLACE PROCEDURE INSERT_REPORT(
FILE_NAME VARCHAR2,
LINE_NO NUMBER) IS
CURSOR CUR_FILE IS
SELECT FILE_NAME,LEVEL FROM DUAL
CONNECT BY LEVEL <=LINE_NO;

TYPE T_FILE_NAME IS TABLE OF VARCHAR2 INDEX BY PLS_INTEGER;
TYPE T_ROW_NUM IS TABLE OF NUMBER INDEX BY PLS_INTEGER;

TBL_FILE_NAME T_FILE_NAME;
TBL_ROW_NUM T_ROW_NUM;
V_BULK_CNT INTEGER:=10000;--自己定义多少行提交一次
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE T_USER_REPORT';

OPEN CUR_FILE;
LOOP
EXIT WHEN CUR_FILE%NOTFOUND;
FETCH CUR_FILE BULK COLLECT INTO
TBL_FILE_NAME,
TBL_ROW_NUM LIMIT V_BULK_CNT;
BEGIN
<<BULK_INSERT>>
FORALL I IN INDICES OF TBL_FILE_NAME SAVE EXCEPTIONS
INSERT/*+NOLOGGING*/ INTO T_USER_REPORT(FILENAME,LINENO,COLUMNNO,RESULTCODE)
VALUES(TBL_FILE_NAME(I),TBL_ROW_NUM(I),0,'00');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE_APPLICATION_ERROR(-20001,'ERROR...');
END BULK_INSERT;
END LOOP;
END INSERT_REPORT;
yjytiantang 2010-08-26
  • 打赏
  • 举报
回复
最好判断一下多少行commit一下。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧