Delphi - Adatok beszúrása beágyazott táblákba

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

forráskód letöltése
A sorozat előző számában megismerhettük a beágyazott táblák előnyeit, valamint deklarációjuk mikéntjét. Mai cikkünkben bemutatjuk, hogyan lehet adatokat bevinni rugalmasan, egyetlen speciális SQL utasítással az egyes beágyazott tábla-típusú oszlopokba, vagyis hogyan használhatjuk fel ehhez a múlt részben megismert elemeket.
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 Oracle11.sql nevű parancsállományt a hivatkozott további objektumok létrehozásához.
A beágyazott táblák speciális objektumok, melyekbe adatokat úgy vihetünk be, ha felhasználjuk az objektum konstruktorát, és paraméterként megadjuk az új rekord elemeit. Ez azonban csak az egyik megoldás.
A másik megoldásban a múlt részben ismertetett jellemzőkkel felruházott THE kulcsszót használhatjuk, mely mintegy helyettesíti a speciális táblát.
A mellékelt alkalmazásban ezt próbálhatjuk ki. A Típus mezőben meg kell adnunk egy maximum 20 karakter hosszú szöveget, melyet az ENTER leütésére beszúrhatunk abba a beágyazott táblába, melyet a ComboBox kontrolban, az ID azonosító kiválasztásával specifikáltunk.
A programban a múlt heti alkalmazást egészítettük ki. A program indulásakor az alsó TDBGrid kontrolt fel kell töltenünk a kiválasztott rekord beágyazott táblájával. Ezt a CreateSubTable metódusban tesszük meg:
procedure TForm1.CreateSubTable(position:integer);
begin
  with DM do begin
  ...
  setSub.CommandText := 'SELECT * FROM THE (SELECT PS FROM AIRPLANES WHERE ID = ' + idCombo.Items.Strings[POSITION] + ')';
  ...
  end;
end;
Az adatok bevitelekor megadunk egy Típust a typeText szerkesztőmezőben, majd ENTER-t nyomva végrehajtjuk az INSERT utasítást. Először azonban le kell kérdeznünk az adott beágyazott tábla CODE oszlopának legnagyobb értékét a GetMaxCode függvénnyel:
...
DM.General.CommandText := 'SELECT MAX(CODE) FROM THE (SELECT PS FROM AIRPLANES WHERE ID = ' + idCombo.Items.Strings[idCombo.ItemIndex] + ')';
rSet := DM.General.Execute;
maxcode := rSet.Fields[0].Get_Value;
GetMaxCode := maxcode;
...
Majd ennek megnövelésével összeállítjuk az INSERT utasítást:
position := idCombo.ItemIndex;
max := GetMaxCode;
inc(max);
DM.General.CommandText := 'INSERT INTO THE (SELECT PS FROM AIRPLANES WHERE ID = ' + idCombo.Items.Strings[position] + ') VALUES (PLANE_INFO(' + IntToStr(max) + ',''' + typeText.Text + '''))';
DM.General.Execute;
Látható, hogy a THE kulcsszó minden DML utasításban, csakúgy mint a lekérdezéseknél is, jól használható.
Az idCombo objektumban tároljuk a főtábla (AIRPLANES) ID oszlopának értékeit, ebből olvassuk ki az adott rekordra vonatkozót.
Az adatok megadásakor felhasználjuk a PLANE_INFO objektum konstruktorát is, paraméterként az elemekkel.
Az adatok frissítése végett meghívjuk a CreateSubTable metódust újra:
CreateSubTable(position);

Oracle adatbázis-kezelés cikksorozat