HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

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


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

Példaprogram letöltése

10145 bájt

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 .NET 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 .NET Data Provider-e nem támogatja az összetett típusú oszlopokat, így a OleDataAdapter vagy az OleDataReader komponensek nem használhatóak ebben az esetben.
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 felső tábla valamely rekordjára klikkelve a megfelelő kezelőfüggvény a visszakapott sor sorszáma alapján határozza meg, hogy melyik sor PASSLIST oszlopának elemeit kell megjelenítenie az alsó táblában.
A program négy tárolt eljárást használ, 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 DataTable objektumban, hogy a DataGrid kontrolok adatforrását képezhessék.
A CreateTablePassangers metódus állítja össze az egyik DataTable objektum elemeit. Létrehozzuk a tábla oszlopait:
DataColumn dc1 = new DataColumn("TRIPID", Type.GetType("System.String"));
DataColumn dc2 = new DataColumn("NAMES", Type.GetType("System.String"));
dtPassangers.Columns.Add(dc1);
dtPassangers.Columns.Add(dc2);
DataRow dr;
...
A megfelelő tárolt eljárásokkal meghatározzuk a PASSANGERS tábla rekordszámát, valamint egy karakterláncba töltjük a TRIPID oszlop elemeit:
GetRowCount.ExecuteNonQuery();
GetPassangersTripids.ExecuteNonQuery();
...
count = Convert.ToInt32(GetRowCount.Parameters["p_count"].Value);
tripids = GetPassangersTripids.Parameters["p_tripids"].Value.ToString();
Egy listába töltjük a TRIPID oszlop elemeit egy ConvertT saját metódussal:
listT = ConvertT(tripids,count);
Az elemeket felhasználva elkészítjük a DataTable objektum rekordjait, és felfűzzük azokat:
for(int i = 0;i<count;i++)
{
  dr=dtPassangers.NewRow();
  dr["TRIPID"] = listT[i].ToString();
  dr["NAMES"] = "Összetett felhasználói típus";
  dtPassangers.Rows.Add(dr);        
}
A CreateTableNames metódussal feltöltjük elemekkel azt a DataTable 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 helyezzük. Paramétereknek értéket adunk:
// Tábla alaphelyzetbe hozása indításkor
...
GetPassangersNames.Parameters["p_tripid"].Value = listT[position].ToString(); 
GetPassangersCount.Parameters["p_tripid"].Value = listT[position].ToString(); 
A parancs végrehajtása:
GetPassangersNames.ExecuteNonQuery();
GetPassangersCount.ExecuteNonQuery();
count = Convert.ToInt32(GetPassangersCount.Parameters["p_count"].Value);
names = GetPassangersNames.Parameters["p_names"].Value.ToString();
...
Listába töltjük a névlista elemeit egy saját ConvertN metódussal:
listN = ConvertN(names,count);
Az elemeket felhasználva elkészítjük a DataTable objektum rekordjait, és felfűzzük azokat:
for(int i = 0;i<listN.Count;i++)
{
  dr=dtNames.NewRow();
  dr["NAMES"] = listN[i].ToString();
  dtNames.Rows.Add(dr);
}
...
Az egyes cellákra klikkelve a DataGrid kontrolban a kezelőfüggvény frissíti az alsó adattáblát:
private void grid1_CurrentCellChanged(object sender,System.EventArgs e)
{
  int position = grid1.CurrentCell.RowNumber;
  CreateTableNames(position);
  grid2.DataSource = dtNames.DefaultView;
}

Cikksorozat

#IDKategóriaCikk címeSorozat
1621DelphiMySQL szerverek elérése Delphi-ből1. rész
1632DelphiMySQL szerverek elérése Delphi-ből2. rész
1641DelphiMySQL szerverek elérése Delphi-ből3. rész
1649DelphiMySQL szerverek elérése Delphi-ből4. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 48. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |