Delphi - Tömb adattípus létrehozása és kezelése PL/SQL-ben

Oracle adatbázis-kezelés 8. rész

forráskód letöltése
Az adattárolás végtelen variációi közt találkozhatunk olyan esetekkel, ahol szükség lehet arra, hogy egy adott oszlop rekordjaiban több elemet tároljunk. A PL/SQL erre is kínál megoldást. Segítségével képesek vagyunk olyan adattípus tömböket létrehozni, melyek összetett típusként oszlopok típusát képezhetik, elemeik pedig beépített típusú elemek. Ezek használatát mutatjuk be cikksorozatunknak ebben a számában.
A példaprogram használata előtt létre kell hozni egy SOUSER sémát az Oracle adatbázis-rendszerünkben, és fel kell ruházni DBA jogosultsággal. A sémába bejelentkezve le kell viszont futtatni a mellékelt Oracle08.sql nevű parancsállományt a hivatkozott további objektumok létrehozásához.
A PL/SQL tömbök, mint absztrakt adattípusok azonos típusú elemek változó hosszúságú tárolói, csakúgy, mint más programnyelvek hasonló funkciójú elemei. Méretük 0, vagy annál nagyobb érték lehet.
Használatuk tulajdonképpen hasonlítható hagyományos tömbök használatához, azonban táblák oszlopainak típusaként megadva az ilyen tömbtípusokat igen körültekintően kell eljárjunk. Felmerül ugyanis egy probléma azzal kapcsolatban, ahogyan a Delphi rendszer támogatja az ilyen összetett típusokat. A válasz röviden az, hogy sehogyan sem. A típus áttekintése után bemutatjuk, milyen módszerekkel lehet áthidalni a fejlesztő eszköz okozta nehézségeket.
A típus deklarációjának szintaxisa a következő:
CREATE TYPE <típusnév> AS {VARRAY | VARYING ARRAY} (méret) OF alaptípus
Alaptípusként használható a PL/SQL által támogatott valamennyi típus.
A mellékelt programban egy PASSANGERS nevű adattábla egyik oszlopa (PASSLIST) rendelkezik tömbtípussal, rekordjainak megjelenítésére sajátosan történik, mivel a Delphi Data Provider-e nem támogatja az összetett típusú oszlopokat, így a TADOCommand vagy a TADODataSet komponensek nem használhatóak ebben az esetben közvetlenül.
A PASSANGERS tábla PASSLIST oszlopa egy olyan tömbtípussal rendelkezik, mely 10 darab név tárolására alkalmas, melyek egyenként 20 karakter hosszúak lehetnek. Deklarációja a következő:
CREATE TYPE P_LIST AS VARRAY(10) OF VARCHAR2(20);
A program Form-ján két tábla található: a felső tábla jeleníti meg a PASSANGERS tábla elemeit, míg az alsó az egyes sorokhoz tartozó névlistát. A Form ’Megjelenítés’ feliratú gombjára klikkelve a ComboBox-ban kiválasztott azonosítóhoz rendelt nevek megjeleníthetők.
A program négy tárolt eljárást használ és két segédtáblát (List1,List2), melyek a VarrayPack csomagban találhatók, és az Oracle08.sql parancsállomány lefuttatása után kerültek az adatbázisba.
A tárolt eljárások karakterláncok formájában adják vissza a PASSANGERS tábla TRIPID és PASSLIST oszlopainak értékeit, melyet feldolgozunk, elemekre bontunk, és elhelyezünk egy-egy TADODataSet objektumban, hogy a DBGrid kontrolok adatforrását képezhessék.
A CreateTablePassangers metódus állítja össze az egyik TADODataSet objektum elemeit. Lekérdezzük a PASSANGERS tábla rekordszámát és a TRIPID oszlop elemeit:
...
GetRowCount.Execute;
GetPassangersTripids.Execute;
...
count := GetRowCount.Parameters[0].Value;
tripids := GetPassangersTripids.Parameters[0].Value;
A List1 táblába töltjük a karakterláncból kihámozott elemeket, ahonnan a DataSet kiolvassa:
ConvertT(tripids,count);
...
A CreateTableNames metódussal feltöltjük elemekkel azt a TADODataSet objektumot, mely a TRIPID-hez rendelt nevek listáját tartalmazza. Lekérdezzük a névlista elemszámát, és a neveket egy karakterláncba. Az eredményeket a tárolt eljárások kimenő paraméterei adják:
...
GetPassangersNames.Execute;
GetPassangersCount.Execute;
...
count := GetPassangersCount.Parameters[1].Value;
names := GetPassangersNames.Parameters[1].Value;
A List2 táblába töltjük a neveket:
ConvertN(names,count);
Az egyes TRIPID azonosítókat kiválasztva a következő függvény frissíti a nevek tábláját:
procedure TForm1.nameButtonClick(Sender: TObject);
var position : integer;
begin
  DM.General.CommandText := 'DELETE FROM LIST2';
  DM.General.Execute;
  position := c.ItemIndex;
  CreateTableNames(position);
  DM.setNames.Requery;
end;

Oracle adatbázis-kezelés cikksorozat