转自:http://blog.csdn.net/bubblekitty/article/details/5441073
FRM-40654:已更新记录。重新查询块,已查看更改!
发现这样的问题有两种可能性:
1. 表被锁定。查看是否有被锁定请参考下文查询,并利用SQL进行解锁。
在erp中我们常常会遇到表锁定的问题,那么我们如何去查那些表被锁定了呢?一下是fifali提供的一个查找解锁表的SQL语句,在执行该SQL后你可以杀掉该表对应的 DB_PID进程。
杀进程的语句为:
alter system kill session 'session_id,serial#';
以下为查询SQL :
- SELECT
dob.OBJECT_NAME Table_Name ,
lo.LOCKED_MODE,
lo.SESSION_ID,
vss.SERIAL#,
vps.spid,
vss.action Action,
vss.osuser OSUSER,
vss.process AP_PID,
VPS.SPID DB_PID,
'alter system kill session ' || '''' || lo.SESSION_ID || ',' ||vss.SERIAL# || ''';' kill_command
from
v$locked_object lo, dba_objects dob, v$session vss, V$PROCESS VPS
where lo.OBJECT_ID = dob.OBJECT_ID
and lo.SESSION_ID = vss.SID
AND VSS.paddr = VPS.addr
order by 2, 3, DOB.object_name;
查找被锁表的SQL:
-
select B.SID,select B.SID, b.USERNAME, b.MACHINE, a.OBJECT, 'alter system kill session ' || '''' || b.SID || ',' || b.SERIAL# || ''';' kill_command FROM V$ACCESS A, V$SESSION B WHERE A.SID = B.SID and upper(a.OBJECT) like '%CUX%' and a.TYPE = 'PACKAGE'
b.USERNAME,
b.MACHINE,
a.OBJECT,
'alter system kill session ' || '''' || b.SID || ',' || b.SERIAL# ||
''';' kill_command
FROM V$ACCESS A, V$SESSION B
WHERE A.SID = B.SID
and upper(a.OBJECT) like '%MTL_DESCR_ELEMENT_VALUES%'
and a.TYPE = 'TABLE'
2. 该表中有一个看不见的字符(空格结尾)遇到该问题,请用数据库后台将空格去掉(首先尝试前台诊断是否可以修改)。