Одна вещь, которую вы могли бы сделать, это - хотя это не очень эффективно, и поэтому я не хотел бы использовать это для больших наборов данных.Создайте функцию уровня строки, чтобы попытаться заблокировать строку.Если это не удастся, то строка уже заблокирована
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;
/
И тогда вы сможете
Select field1, field2, is_row_locked(rowid, 'MYTABLE') from mytable;
Это будет работать, но это не красиво и не эффективно.
Действительно, у него есть только одно искупительное качество - оно будет работать, даже если у вас нет выделенных привилегий в различных таблицах v $, требуемых в связанном документе.Но если у вас есть привилегии, определенно идите другим путем.