2017-03-02 36 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? –