Temat: ORA-01410: niepoprawny ROWID

Próbuje znaleźć blokowany przez inną transakcję rekord który inna sesja próbuje modyfikować jak niżej:

sesjia1

SQL> desc test_trzy;
Nazwa Wartość NULL? Typ
----------------------------------------- -------- ----------

A NUMBER
B NUMBER
C NUMBER

SQL> update test_trzy set a=2 where a=254;

1 wiersz został zmodyfikowany.


sesja2

SQL> update test_trzy set a=2 where a=254;


sesja2 czeka

sesja3

SQL> select a.object_id from v$locked_object a, dba_objects c where a.object_id=
c.object_id;

OBJECT_ID
----------
197013
197013

SQL> select dbms_rowid.rowid_create(1, row_wait_obj#, row_wait_file#, row_wait_b
lock#, row_wait_row#) from v$session where row_wait_obj#=197013;

DBMS_ROWID.ROWID_C
------------------
AAAwGVAAGAAARgeAAA

SQL> select * from test_trzy where rowid = 'AAAwGVAAGAAARgeAAA';
select * from test_trzy where rowid = 'AAAwGVAAGAAARgeAAA'
*
BŁĄD w linii 1:
ORA-01410: niepoprawny ROWID

SQL> select rowid from test_trzy where a = 254;

ROWID
------------------
AAAxFoAAGAAARgeAAA


Widać, że ROWID wygenerowany przez dbms_rowid.rowid_create jest inny niż rzeczywisty ROWID.

Czy ktoś spotkał się już z takim problemem i udało mu się rozwiązać.
Za odpowiedzi z góry dzięki.
Paweł Grzegorz Kwiatkowski

Paweł Grzegorz Kwiatkowski Architekt
oprogramowania,
Ericsson

Temat: ORA-01410: niepoprawny ROWID

Zdaje się, że v$session.row_wait_file# to absolute file number, zaś w DBMS_ROWID.ROWID_CREATE podajesz relative file number.

Co zwracają:
DBMS_ROWID.ROWID_BLOCK_NUMBER
DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO
DBMS_ROWID.ROWID_RELATIVE_FNO
DBMS_ROWID.ROWID_ROW_NUMBER

dla tego "dobrego" rowida: AAAxFoAAGAAARgeAAA ?

--- Edited:
Byzdure napisałem :)

AAAwGV AAG AAARge AAA - dobry
AAAxFo AAG AAARge AAA - zły

Różnica jest na object_id (pierwsze 6 znaków).

select object_id, data_object_id from dba_objects where object_id=197013;

Czy jak podstawisz data_object_id do rowid_create to będzie dobrze? :)Paweł Grzegorz Kwiatkowski edytował(a) ten post dnia 22.03.12 o godzinie 13:36

Temat: ORA-01410: niepoprawny ROWID

dokładnie tu jest problem


SQL> select a.object_id from v$locked_object a, dba_objects c where a.object_id=
c.object_id;

OBJECT_ID
----------
197013
197013

SQL> select row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#,
2 dbms_rowid.rowid_create(1, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#)
3 from v$session where row_wait_obj#=197013;

ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# DBMS_ROWID.ROWID_C
------------- -------------- --------------- ------------- ------------------
197013 6 71710 0 AAAwGVAAGAAARgeAAA

SQL> select DBMS_ROWID.ROWID_OBJECT('AAAxFoAAGAAARgeAAA') from dual;

DBMS_ROWID.ROWID_OBJECT('AAAXFOAAGAAARGEAAA')
---------------------------------------------
201064

SQL> select object_id, data_object_id from dba_objects where object_id=197013;

OBJECT_ID DATA_OBJECT_ID
---------- --------------
197013 201064


Dzięki za podpowiedź.

Następna dyskusja:

ora-01455 przy rman'ie




Wyślij zaproszenie do