AB2gyak (főmenü)    Gyak.köv.    AB2ea    2.gyak     4.gyak    OracleDoc 
3.gyak. Oracle adatbázisok felépítése és gépes feladatok ROWID-re
   
G (gépes feladatok)  
> G4. Egyéb objektumok (pl. szinonima, szekvencia, adatbázis-kapcsoló)
> G5. Táblák és tárolási paraméterek, ROWID adattípus  
     

G4. Egyéb objektumok (pl. szinonima, adatbázis-kapcsoló)
(DBA_OBJECTS, DBA_SYNONYMS, DBA_SEQUENCES, DBA_DB_LINKS)
   
Segédanyagok: EgyébObjektumok.txt  
>> OracleDoc: SQL Language Reference >> innen a CREATE utasítások
   
4.01. Szinonimák létrehozása és használata: a HR séma tábláihoz készítsünk
         szinonimákat és keressük meg a DBA_SYNONYMS katalógustáblában.
   
4.02.  Adjuk ki az alábbi utasítást: SELECT * FROM szinonima1;
          majd a katalógustáblák lekérdezésével derítsük ki, hogy kinek melyik tábláját
          kérdeztük le. (Ha nézettel találkozunk, azt is fejtsük ki, hogy az mit kérdez le.)
 
4.03. Szekvencia létrehozása és használata
         - Előkészítés: sila.emp és sila.dept hozzuk létre (de üresen!) saját táblákat.
         - Hozzunk létre egy szekvenciát, amelyik az osztály azonosítókat generálja
           a számunkra. Minden osztály azonosító a 10-nek többszöröse legyen.
            (create sequence)
         - Vigyünk fel 3 új osztályt és osztályonként minimum 3 dolgozót a táblákba.
           Az osztály azonosítókat a szekvencia segítségével állítsuk elő, és ezt tegyük be
           a táblába. (Vagyis ne kézzel írjuk be az azonosítót.)
         - A felvitel után módosítsuk a 10-es osztály azonosítóját a köv.érvényes (generált)
           osztály azonosítóra. (Itt is a szekvencia segítségével adjuk meg, hogy mi lesz a
           következő azonosító.) A 10-es osztály dolgozóinak az osztályazonosító ertékét is
           módosítsuk az új értékre.
 
4.04. Hozzunk létre adatbázis-kapcsolót (database link) az ablinux adatbázisban,
         amelyik a másik tomx adatbázisra mutat, majd keressük ki a megfelelő
         adatszótárnézetben (DBA_DB_LINKS) az erről tárolt információt. 
            
                    CREATE DATABASE LINK tomx
        connect to <azonosito> identified by <jelszo>
        USING 'tomx.inf.elte.hu:1521/ora11g';

   
         Az adatbáziskapcsoló segítségével adjuk meg olyan lekérdezést, amely mindkét
         adatbázis tábláit használja. Például a TOMX adatbázisban legyen az emp2 tábla
         (lásd 4.03. feladatot, de csak ezt, a dept2-t nem), az ABLINUX adatbázisban
         pedig a dept2 tábla (és itt pedig csak a dept2 tábla legyen, de az emp2 nem).
         Adjunk olyan lekérdezést az ablinux adatbázisban, amely innen a dept2 táblát
         a másik adatbázisból pedig az emp2@TOMX  táblát is használja.
       

G5. Táblák és tárolási paraméterek, ROWID adattípus  

Segédanyagok: Táblák létrehozása tárolási paraméterek.txt
   
ROWID adattípus formátuma és jelentése
(lásd még DBMS_ROWID package)

18 karakteren írodik ki, a következő formában: OOOOOOFFFBBBBBBRRR
OOOOOO -  az objektum azonosítója
FFF    -  fájl azonosítója (táblatéren belüli relativ 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
      
Feladatok:
5.01. Az SH felhasználó CUSTOMERS táblája hány blokkot foglal le az adatbázisban?
         (Vagyis azt nézzük meg, hogy hány olyan blokk van, ami ehhez a táblához van
          rendelve és így azok már más táblákhoz nem adhatók hozzá?) (DBA_SEGMENTS)
          Hasonlítsuk össze ezt azzal, hogy mennyi a foglalt hely összesen? (DBA_EXTENTS)
   
5.02. Az SH felhasználó CUSTOMERS táblájának adatai hány blokkban helyezkednek el?
         (Vagyis a tábla sorai ténylegesen hány blokkban vannak tárolva?)
         !!! -> Ez a kérdés nem ugyanaz mint az előző, most a ROWID-et használjuk!
 
5.03. Az egyes blokkokban hány sor van?
     
5.04. Hozzunk létre egy olyan táblát (lásd tárolási paraméterek.txt) az EXAMPLE táblatéren,
         amelynek szerkezete megegyezik a HR.EMPLOYEES tábláéval és pontosan
        128 KB helyet foglal az adatbázisban. Foglaljunk le manuálisan egy újabb 128 KB-os
        extenst a táblához. Vigyünk fel sorokat addig, amig az első blokk tele nem lesz,
        és 1 további sora  lesz még a táblának a második blokkban.
        (A felvitelt PL/SQL programmal végezzük és ne kézzel, mert úgy kicsit sokáig tartana.)
 
5.05. Próbáljuk ki az előzőt ismét, de most a PCTFREE értéket állítsuk 40-re.
         Mindkét esetben ellenőrizzük is, hogy a sorok tényleg két blokkban vannak,
         és a másodikban csak egyetlen sor van.
       
Szorgalmi feladat (beküldhető)
5.06. Írjunk meg egy PL/SQL függvényt, amely a ROWID 64-es kódolásnak
        megfelelő számot adja vissza. A függvény paramétere egy karakterlánc,
        eredménye pedig a kódolt numerikus érték legyen. (Elég ha a függvény
        maximum 6 hosszú, helyesen kódolt karakterláncokra működik, hosszabb
        karakterláncra vagy rosszul kódolt paraméterre adjon vissza -1-et.)
        Ennek a fv-nek a segítségével adjuk meg egy táblabeli sor pontos fizikai
        elhelyezkedését. (Melyik fájl, melyik blokk, melyik sora)
        Például az emp tábla azon sorára, ahol a dolgozó neve 'KING'.
 
Megjegyzés: A gyakorlatok egyik célkitűzése az is, hogy az Oracle Database
Online Documentation könyvtárban otthonosan mozogjunk, lásd például 
PL/SQL Packages and Types Reference "DBMS_ROWID" fejezetét.
Gyakorlásként írjuk meg a fenti PL/SQL függvényt. A megírt függvényünk
működését könnyen ellenőrizhetjük az DBMS_ROWID csomagban
szereplő függvényekkel, az alábbi utasítással, írjuk be a függvényünket
minden substr(...)-hoz egészítsük ki a sajátfvnév(substr(...))-el.

       SELECT rowid, substr(rowid, 1, 6),
         DBMS_ROWID.rowid_object(ROWID),
         substr(rowid, 7, 3),
         DBMS_ROWID.rowid_relative_fno(ROWID),
         substr(rowid, 10, 6),
         DBMS_ROWID.rowid_block_number(ROWID),
         substr(rowid, 16, 3),
         DBMS_ROWID.rowid_row_number(ROWID)
    FROM sila.emp;

      
Fel a lap tetejére (mai gyak témakörei)      Vissza az AB2gyak kezdőlapjára