2017-03-02 4 views
0

にロックされた行のROWIDを取得する - 私がコミットしていない、として私のように更新クエリでdept表に更新しております神託

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

、行ロックは、行に配置されます。私はV$LOCKからロックされたdeptテーブルのrowidを見つけたいと思っています。

現在、私はそれを取得する方法を見つけることができません。他の方法はありますか?

答えて

0

アップデートする前に、おそらくあなたは、次の文を実行できます。クエリの

SELECT ROWID AS RID FROM DEPT WHERE DEPTNO = 20 FOR UPDATE; 
+0

私はロックをシミュレートしました。基本的には、ロックがアプリケーション(jdbc呼び出し)によって行われ、私がROWIDを認識していない場合、ROWIDを取得したいと思います。 –

+0

なぜこれが必要ですか? – BobC

+0

アプリケーションによってロックされたテーブルのrowsidsを取得します。 –

0

まずV$LOCKED_OBJECT OBJECT_IDを取得します。次にv$open_cursorを照会してSQL_TEXTを取得し、これを使用してROWIDを取得できます。

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

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

を実行し、次のcommads Oracleは、ロックされた行を追跡しません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 

として。ブロックされた行がある場合は、次に示すように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..Id = 1ではなくbind(id =:id)の値が入っていれば? –

関連する問題