使用Oracle,是否可以在执行select语句时指示当前哪些行已锁定(哪些行未锁定)(我不想锁定任何行,仅能显示哪些行已锁定)?
例如,一个伪列将返回对该行的锁定/事务:
SELECT lockname FROM emp;
您可以做的一件事是-尽管效率不高,所以我不想将其用于大型数据集。创建一个行级函数来尝试锁定该行。如果失败,则该行已被锁定
CREATE OR REPLACE FUNCTION is_row_locked (v_rowid ROWID, table_name VARCHAR2)
RETURN varchar2
IS
x NUMBER;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE 'Begin
Select 1 into :x from '
|| table_name
|| ' where rowid =:v_rowid for update nowait;
Exception
When Others Then
:x:=null;
End;'
USING OUT x, v_rowid;
-- now release the lock if we got it.
ROLLBACK;
IF x = 1
THEN
RETURN 'N';
ELSIF x IS NULL
THEN
RETURN 'Y';
END IF;
END;
/
Run Code Online (Sandbox Code Playgroud)
然后你可以
Select field1, field2, is_row_locked(rowid, 'MYTABLE') from mytable;
Run Code Online (Sandbox Code Playgroud)
它可以工作,但是效率不高。
确实,它具有一种完全可赎回的质量-即使您在链接文档中所需的各种v $表上没有选择privs,它也可以工作。但是,如果您拥有privs,则一定要走另一条路。