Az indexek szempontjából fontos a ROWID típus ismerete ====================================================== Speciális mutató típus, amivel egy sort lehet azonosítani. Minden sorról meg tudom mondani, hogy egy adott sor: - melyik adatfájlban van - azon belül melyik blokkban - azon belül hányadik rekord Ez nincs a táblában tárolva, de mégis úgy viselkedik: pszeudo oszlop Példa: SELECT rowid, empno, ename, sal FROM nikovits.emp; ROWID adattípus formátuma és jelentése ====================================== 18 karakteren íródik ki, a következő formában: OOOOOOFFFBBBBBBRRR OOOOOO - az objektum azonosítója FFF - fájl azonosítója (táblatéren belüli relatív sorszám) BBBBBB - blokk azonosító (a fájlon belüli sorszám) RRR - sor azonosító (a blokkon belüli sorszám) A ROWID megjelenítéskor 64-es alapú kódolásban jelenik meg. Az egyes számoknak (0-63) a következő karakterek felelnek meg: A-Z -> (0-25), a-z -> (26-51), 0-9 -> (52-61), '+' -> (62), '/' -> (63) Pl. 'AAAAAB' -> 000001 A ROWID egy további használata ============================== A ROWID általában minden olyan esetben használható, amikor egy konkrét sorra mutató pointerre van szükségünk. Például egy constraint utólagos létrehozásakor megadható, hogy a már létező, a constraintet megsértő sorok sorazonosítói mely táblába íródjanak be, hogy ezekkel a sorokkal valamit tenni tudjunk. Alapértelmezés szerint (ha nem adjuk meg a kulcsszót) az EXCEPTIONS nevű táblába íródnak be, aminek a létrehozását a következő utasítással végezhetjük el: CREATE TABLE exceptions(row_id rowid, owner varchar2(30), table_name varchar2(30), constraint varchar2(30)); lásd az oracle által előre megadott utlexcpt.sql scriptet Hozzunk létre egy példa táblát: CREATE TABLE const_t (o1 number, o2 char(10), o3 date ); Szúrjunk be néhány sort, amelyek közül néhány megsérti az alább megadandó constraintet. INSERT INTO const_t VALUES(1, 'Egy', '2004-jan-02'); INSERT INTO const_t VALUES(2, 'Ket', '2003-jan-02'); INSERT INTO const_t VALUES(3, 'Har', '2005-jan-02'); Az alábbi utasítást nem fogja végrehajtani a rendszer, és hibaüzenetet kapunk, viszont feltölti az exceptions táblát a megfelelő sorokkal. ALTER TABLE const_t ADD CONSTRAINT const_c CHECK(o3 > TO_DATE('2005-jan-01', 'YYYY-mon-dd')) EXCEPTIONS INTO exceptions; Erről az alábbi lekérdezéssel győződhetünk meg: SELECT * FROM const_t WHERE ROWID IN (SELECT ROW_ID FROM exceptions); O1 O2 O3 ---- ---------- ----------- 4 Egy 2003-jan-02 1 Egy 2004-jan-02