11.GYAKORLAT (INFORMÁCIÓS RENDSZEREK) 
   
A rendszerkatalógus maga is egy adatbázisnak tekinthető, amit lekérdezve egyre
többet tudhatunk meg az adatbázisban tárolt dolgokról és azok tulajdonságairól.
 
A rendszerkatalógus tábláinak (nézeteinek) elnevezése: DBA_..., ALL_..., USER_...
   USER (az adott user tulajdonában lévő objektumok) pl. USER_TABLES
   ALL  (amihez joga van az adott usernek) pl. ALL_TABLES
   DBA  (az adatbázis összes objektuma) pl. DBA_TABLES
 
A rendszerkatalógus másik szokásos elnevezése: adatszótár (Data Dictionary)
Figyelem! Az adatszótárban nagybetűvel vannak tárolva az adatok!
 
A mai gyakorlaton az alábbi témakörökben oldunk meg SQL lekérdezési feladatokat 
> 1.rész Adatbázisbeli objektumok: Kérdezzük le a DBA_OBJECTS nézettáblát
> 2.rész Táblák és oszlopai: DBA_TABLES és DBA_TAB_COLUMNS nézetekből 
> 3.rész Adattárolással kapcsolatos fogalmak: Az adatok fizikai/logikai struktúrája
> 4.rész  ROWID
> 5.rész  Indextáblák
   
--- --- --- --- --- ---
> 1.rész Adatbázisbeli objektumok: Kérdezzük le a DBA_OBJECTS nézettáblát
- Az alábbi lekérdezések segítenek feltérképezni, hogy milyen objektumok  vannak
  egy adatbázisban, mi a típusa (OBJECT_TYPE), ki a tulajdonosa, mikor hozta létre. 
- Minden adatbázisbeli objektumnak van egy egyedi azonosítója (OBJECT_ID), és
  amelyikhez tartozik szegmens, annak egy ún. adatobjektum azonosítója is van
  (DATA_OBJECT_ID). Amelyik objektumhoz nem tartozik szegmens, annak az
  adatobjektum azonosítója NULL, és ezeknek csak a definíciója van (szövegesen)
  tárolva a szótárban, ezek a tényleges tárolást nem igénylő objektumok.
 
Feladatok:
1.01. Hány különböző típusú objektum van nyilvántartva az adatbázisban?
1.02. Melyek ezek a típusok?
1.03. Melyek azok az objektum típusok, amelyek tényleges tárolást igényelnek,
         vagyis tartoznak hozzájuk adatblokkok?
1.04. Melyek azok az objektum típusok, amelyek nem igényelnek tényleges
         tárolást igényelnek, vagyis tartoznak hozzájuk adatblokkok?
         (az utóbbi két lekérdezés metszete nem üres, például partícionált táblák)
1.05. Kik azok a felhasználók, akiknek több mint 10 féle objektumuk van?
1.06. Kik azok a felhasználók, akiknek van triggere és nézete is?
1.07. Kik azok a felhasználók, akiknek van nézete, de nincs triggere?
1.08. Kik azok a felhasználók, akiknek több mint 20 táblájuk, de
         maximum 15 indexük van?
   
--- --- --- --- --- ---
> 2.rész Táblák és oszlopai: DBA_TABLES és DBA_TAB_COLUMNS nézetekből
   Mely táblák vannak egy adott felhasználó tulajdonában?
   - A DBA_TABLES adatszótár az összes táblát felsorolja, pl HR séma táblái ezek:
     SELECT table_name FROM dba_tables WHERE owner='HR';
   Mit tudhatunk a táblák oszlopairól, milyen nevű és típusú oszlopai vannak, stb.
  - A DBA_TAB_COLUMNS adatszótár a táblák oszlopairól tartalmaz információt.
     
Feladatok:
2.01. Hozzunk létre táblákat, majd keressük meg az adatszótár nézetekben,
         hogy milyen információkat találhatunk a táblákról és a táblák oszlopairól.
         Adatszótár nézetek: DBA_OBJECTS, DBA_TABLES és DBA_TAB_COLUMNS 
2.02. Hozzunk létre táblákat megszorításokkal, nézzük meg hogyan jelennek meg
         az oszlopok és a megszorítások a DBA_CONSTRAINTS katalógustáblában is.
2.03. Hozzunk létre nézettáblákat, nézzük meg a DBA_VIEWS katalógustáblában.
2.04. Hány oszlopa van a sila.emp táblának?
2.05. Milyen típusú a sila.emp tábla 6. oszlopa?
2.06. Adjuk meg azoknak a tábláknak a tulajdonosát és nevét, amelyeknek
         van 'Z' betűvel kezdődő oszlopa.
2.07. Adjuk meg azoknak a tábláknak a tulajdonosát és nevét, amelyeknek
         legalább 8 darab dátum tipusú oszlopa van.
2.08. Adjuk meg azoknak a tábláknak a tulajdonosát és nevét, amelyeknek
         1. es 4. oszlopa is VARCHAR2 tipusú.
   
--- --- --- --- --- ---
> 3.rész Adattárolással kapcsolatos fogalmak: Az adatok fizikai/logikai struktúrája
   >> Oracle Database Concepts >> innen 12. Logical Storage Structures  
 
  DBA_TABLES, DBA_DATA_FILES, DBA_TEMP_FILES,
  DBA_TABLESPACES, DBA_SEGMENTS, DBA_EXTENTS, DBA_FREE_SPACE
   
 
Feladatok:
3.01. Adjuk meg az adatbázishoz tartozó adatfile-ok (és temporális fájlok)
         nevét és méretét, méret szerint csökkenő sorrendben.
         (DBA_DATA_FILES, DBA_TEMP_FILES)
   
3.02. Adjuk meg, hogy milyen táblaterek vannak létrehozva az adatbázisban,
         az egyes táblaterek hány adatfájlból állnak, és mekkora az összméretük.
         (tablater_nev, fajlok_szama, osszmeret) Vigyázat, van temporális táblatér is!
   
3.03. Mekkora a blokkok mérete a USERS táblatéren? (DBA_TABLESPACES)
   
3.04. Melyik a legnagyobb méretű tábla szegmens az adatbázisban
         (a tulajdonost és a szegmens nevét is adjuk meg), hány extensből áll? 
         (A particionált táblákat most ne vegyük figyelembe.) (DBA_SEGMENTS)
   
3.05. Adjuk meg adatfájlonként, hogy az egyes adatfajlokban mennyi
         a foglalt hely összesen.  (DBA_EXTENTS, DBA_DATA_FILES)
   
3.06. Melyik felhasználó objektumai foglalnak összesen a legtöbb helyet
         az adatbázisban?
   
3.07. Van-e valamelyik felhasználónak olyan táblája, amelyik
         több adatfájlban is foglal helyet?
 
--- --- --- --- --- ---
> 4.rész  ROWID
   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
 
       SELECT rowid, empno, ename,
      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;

   
Feladatok:
4.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)
   
4.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!
 
4.03. Az egyes blokkokban hány sor van?
     
--- --- --- --- --- ---
> 5.rész  Indextáblák
   >> Oracle Database Concepts >> innen 3. Indexes  
   >> Oracle: SQL Language Reference >> innen CREATE INDEX példák
 
  DBA_INDEXES, DBA_IND_COLUMNS, DBA_IND_EXPRESSIONS
 
Feladatok:
5.01. Hozzunk létre egy vagy több táblához több különböző indexet!
         Legyen köztük több oszlopos, csökkenő sorrendű, függvény alapú,
         fordított kulcsú (reverse), bitmap index, lásd create index példák.txt
         Állapítsuk meg ezeknek az indexeknek a különböző tulajdonságait a
         katalógusokból: DBA_INDEXES, DBA_IND_COLUMNS, DBA_IND_EXPRESSIONS
 
5.02. Adjuk meg azoknak a tábláknak a nevét, amelyeknek van csökkenő
         sorrendben indexelt oszlopa.
 
5.03. Adjuk meg azoknak az indexeknek a nevét, amelyek legalább 9 oszloposak
         (vagyis a táblának legalább 9 oszlopát vagy egyéb kifejezését indexelik).

5.04. Adjuk meg azon kétoszlopos indexek nevét és tulajdonosát, amelyeknek
         legalább az egyik kifejezése függvény alapú.