2017-03-02 71 views
0

我与更新查询作为开展有关dept表的更新 -获取锁定行的ROWID在Oracle

update dept set dname = initcap(dname) where deptno=20; 

正如,我没有犯过,行锁将被放置在该行。我想知道从V$LOCK锁定的部门表的rowid

目前,我无法弄清楚如何得到它。有没有其他方法?

回答

0

也许你能不能更新之前执行以下语句:

查询 V$LOCKED_OBJECT
SELECT ROWID AS RID FROM DEPT WHERE DEPTNO = 20 FOR UPDATE; 
+0

我模拟了锁。基本上,我想获得rowid,如果锁定是由应用程序(jdbc调用)完成的,并且我不知道rowid。 –

+0

你为什么需要这个? – BobC

+0

获取应用程序锁定的表的行数。 –

0

率先拿到OBJECT_ID。然后查询v$open_cursor得到SQL_TEXT,使用这个你可以得到ROWIDs。

SQL> select * from t2 where id=1 for update; 

     ID KEY     VALUE 
---------- -------------------- -------------------- 
     1 A101     Athens 

运行以下commads为SYSDBA

SQL> select session_id, object_id from v$locked_object; 

SESSION_ID OBJECT_ID 
---------- ---------- 
     1724  213690 

SQL> select user_name, sql_text from v$open_cursor where sid=1724; 

USER_NAME SQL_TEXT 
--------- ------------------------------------------------------------ 
JAY   insert into sys.aud$(sessionid,entryid,statement,ntimestamp 
JAY   select * from t2 where id=1 for update 


SQL> select rowid from jay.t2 where id=1; 

ROWID 
------------------ 
AAA0K6AAEAAAACsAAA 

Oracle不跟踪锁定的行。如果有阻塞的行,那么您可以获取rowid,如下所示。

SQL> select dbms_rowid.ROWID_CREATE(1,s.ROW_WAIT_OBJ#,s.ROW_WAIT_FILE#,s.ROW_WAIT_BLOCK#,s.ROW_WAIT_ROW#) rid from v$session s join v$locked_object lo on s.ROW_WAIT_OBJ#=lo.object_id; 
+0

非常感谢Jay ..如果它包含bind(id =:id)值而不是id = 1? –