LOOP中DEL操作的问题

[复制链接]
查看11 | 回复9 | 2008-10-24 13:22:33 | 显示全部楼层 |阅读模式
我有个过程,需要循环DEL,表ZMES_PP_CLOSE_DEL 有1万多条记录,在执行该过程后,它只处理了4000多条记录,过程就停了,不知道是什么原因

CREATE OR REPLACE PROCEDURE PRO_ZMES_PP_CLOSE_DEL
IS
AUF VARCHAR2(12);
BEGIN
LOOP
SELECT AUFNR INTO AUF FROM ZMES_PP_CLOSE_DEL WHERE ROWNUM<=1;
IF SQL%FOUND THEN
DELETE FROM ZMES_PP_WOCONFM WHERE MANDT='800' AND AUFNR=AUF AND PROCESS_FLG='2';
DELETE FROM ZMES_PP_CLOSE WHERE MANDT='800' AND AUFNR=AUF AND PROCESS_FLG='2';
DELETE FROM ZMES_PP_CLOSE_DEL WHERE AUFNR=AUF;
COMMIT;
END IF;
END LOOP;
EXCEPTION
WHENOTHERS THEN
ROLLBACK;
END PRO_ZMES_PP_CLOSE_DEL;
/
回复

使用道具 举报

千问 | 2008-10-24 13:22:33 | 显示全部楼层
AUFNR看起来好像是primary key?
注意纪录中AUFNR是否有null的存在?
保证AUFNR非空就可以了。
虽然写的不好,但是要达到删除纪录的目的应该还是可以的。而且PRO_ZMES_PP_CLOSE_DEL 肯定是删除光的。
回复

使用道具 举报

千问 | 2008-10-24 13:22:33 | 显示全部楼层
最初由 Talmud 发布
[B]AUFNR看起来好像是primary key?
注意纪录中AUFNR是否有null的存在?
保证AUFNR非空就可以了。
虽然写的不好,但是要达到删除纪录的目的应该还是可以的。而且PRO_ZMES_PP_CLOSE_DEL 肯定是删除光的。 [/B]


AUFNR不是PRIMARY KEY,而且都有记录。表ZMES_PP_CLOSE_DEL 上未建任何约束和索引
回复

使用道具 举报

千问 | 2008-10-24 13:22:33 | 显示全部楼层
查询v$session_wait,看看它在等待什么
回复

使用道具 举报

千问 | 2008-10-24 13:22:33 | 显示全部楼层
[QUOTE]最初由 hanson 发布
[B]查询v$session_wait,看看它在等待什么 [/B][/QUOT

SID EVENT
WAIT_TIMESTATE
15 enqueue
0
WAITING
30db file sequential read -1
WAITED KNOWN TIME
其他的等待事件是smon timer ,rdbms ipc message,SQL*Net message to client,SQL*Net more data to client,SQL*Net message from client,应该跟我这个会话关系不大吧
回复

使用道具 举报

千问 | 2008-10-24 13:22:33 | 显示全部楼层
运行PRO_ZMES_PP_CLOSE_DEL 的sid是30吗?这表示在进行索引扫描。
你可以根据对应的p2找到到底是哪个表。
select segment_name from dba_segments where p2的值 between block_id and block_id+blocks
回复

使用道具 举报

千问 | 2008-10-24 13:22:33 | 显示全部楼层
最初由 hanson 发布
[B]运行PRO_ZMES_PP_CLOSE_DEL 的sid是30吗?这表示在进行索引扫描。
你可以根据对应的p2找到到底是哪个表。
select segment_name from dba_segments where p2的值 between block_id and block_id+blocks [/B]

between block_id and block_id+blocks 我到那里找block_id和blocks的值
回复

使用道具 举报

千问 | 2008-10-24 13:22:33 | 显示全部楼层
关注
回复

使用道具 举报

千问 | 2008-10-24 13:22:33 | 显示全部楼层
多半是有session 加了锁
猜测!
回复

使用道具 举报

千问 | 2008-10-24 13:22:33 | 显示全部楼层
最初由 gujun74 发布
[B]我有个过程,需要循环DEL,表ZMES_PP_CLOSE_DEL 有1万多条记录,在执行该过程后,它只处理了4000多条记录,过程就停了,不知道是什么原因

CREATE OR REPLACE PROCEDURE PRO_ZMES_PP_CLOSE_DEL
IS
AUF VARCHAR2(12);
BEGIN
LOOP
SELECT AUFNR INTO AUF FROM ZMES_PP_CLOSE_DEL WHERE ROWNUM<=1;
IF SQL%FOUND THEN
DELETE FROM ZMES_PP_WOCONFM WHERE MANDT='800' AND AUFNR=AUF AND PROCESS_FLG='2';
DELETE FROM ZMES_PP_CLOSE WHERE MANDT='800' AND AUFNR=AUF AND PROCESS_FLG='2';
DELETE FROM ZMES_PP_CLOSE_DEL WHERE AUFNR=AUF;
COMMIT;
END IF;
END LOOP;
EXCEPTION
WHENOTHERS THEN
ROLLBACK;
END PRO_ZMES_PP_CLOSE_DEL;
/ [/B]

怀疑是DELETE时候报错,然后跳到异常处理部分自动终止了。
你可以在异常处理中把错误信息写到一张日志表中。
btw:这种循环删除数据的做法效率极低。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行