错误提示: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,

   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'

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'

2.  该表中有一个看不见的字符(空格结尾)遇到该问题,请用数据库后台将空格去掉(首先尝试前台诊断是否可以修改)。