Delphi - SQL utasítások végrehajtása

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

forráskód letöltése
Mint minden adatbázisokkal kapcsolatos feladathoz, így az Oracle adatbázis-kezelő esetében is ismernünk kell, hogy milyen adattípusokat támogat a rendszer. Ebben a cikkben bemutatjuk az Oracle főbb adattípusait, felhasználásuk módját. A típusok megismerése után végignézzük, hogyan végezhetünk el alapvető, adatmanipulációs SQL utasításokat programjainkban.
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 futtatni a mellékelt Oracle02.sql script-et a megfelelő objektum létrehozásához.
PL/SQL
Előző cikkünkben csak említés szintjén találkozhattunk a PL/SQL kifejezéssel, most azonban bővebb magyarázattal szolgálunk. Ahhoz ugyanis, hogy komolyan munkához láthassunk az Oracle rendszerben, meg kell ismernünk a rendszer belső nyelvét. A PL/SQL, mint belső nyelv lehetővé teszi, hogy blokk struktúrájú procedurális kódrészletekben adatmanipulációs és lekérdező utasításokat hajtsunk végre. Hatékonyan támogatja tranzakció-kezelési feladatok megoldását.
Struktúrája a következő:
  • Blokkstruktúra
Ezen jellemzője révén a PL/SQL–ben a programok logikai részekre oszlanak, melyekhez utasítások és az adott blokkban használható (lokális) változók tartoznak. Ezen túlmenően a blokk lehetővé teszi a blokkon belül bekövetkezett hibaállapotok (kivételek) kezelését.
  • Vezérlési szerkezetek
Használhatunk feltételes utasításokat, hurkokat és elágazásokat a program lefolyásának vezérlésére, és annak eldöntésére, hogy mikor és hogyan kell SQL vagy más utasításokat végrehajtani. Az Oracle eszközei az utasítások együttesét így csoportosan értelmezik, és nem kell minden parancsot külön trigger lépésekbe tennünk, illetve nem kell minden SQL utasítást külső programnyelvbe ágyaznunk.
  • Integráció
A PL/SQL központi szerepet játszik az Oracle szerverben a tárolt eljárások, triggerek és csomagok létrehozásakor. Változói és adattípusai megfelelnek az SQL adattípusainak.
A PL/SQL nem önálló Oracle termék, hanem egy programnyelv és a hozzá tartozó fordító és futtató rendszer, melyet az Oracle szerver és bizonyos Oracle eszközök alkalmaznak. A PL/SQL blokkokat az ún. „PL/SQL gépek” hajtják végre, melyek részei az Oracle szervernek. A PL/SQL támogatja az alapvető SQL utasításokat.
Támogatott adattípusok
A következőkben megvizsgáljuk az Oracle alapvető adattípusait, valamint megadjuk azok megfelelőit az MS SQL Server rendszerben. Használni később csak azt a néhány adattípust fogjuk, amelyet mind a PL/SQL nyelv, mind pedig a Delphi rendszere támogat.
Az Oracle adattípus-listája, összevetve az SQL Server jól megszokott listájával nem tűnik hosszúnak, azonban látni fogjuk, hogy egy-egy adattípus megfelel jó néhány SQL Serveres típus együttesének, mintegy kiváltva azt. Ez jól tükrözi, hogy az Oracle cég elsősorban nagygépes környezetre fókuszálta rendszerét. Az alábbi típuslista tájékoztató jellegű, ismertetése után felsoroljuk azt a néhány típust, melynek megvan a PL/SQL-oldali támogatása is.
Oracle adattípus Definíció
CHAR Fix hosszúságú karakteres adattípus, minimális mérete 1, maximális mérete 2000 karakter.
DATE Dátum adattípus. Lehetséges értékei: ie. 4712-től isz. 4712-ig.
DECIMAL Megegyezik a NUMBER típussal.
FLOAT Megegyezik a NUMBER típussal.
INTEGER Megegyezik a NUMBER típussal.
LONG Számértékek tárolása legfeljebb 2GB méretben.
LONG RAW Nyers adatok tárolására. Megegyezik a LONG típussal.
LONG VARCHAR Megegyezik a LONG típussal.
NUMBER(<jegyek>,<tizedesek>) Számértékek tárolására szolgál. Tizedesek megadása nélkül a numerikus értékeket egész számmá kerekíti. Max. értéke: 9.99..E125.
SMALLINT Megegyezik a NUMBER típussal.
RAW Nyers bináris adatok tárolása legfeljebb 255 bájt méretben.
VARCHAR2 Legfeljebb 4000 bájtos karakterlánc tárolására.
VARCHAR Megegyezik a VARCHAR2 típussal.
BLOB Nagyméretű bináris objektumok tárolása legfeljebb 4GB méretben.
COB Nagyméretű karakteres objektumok tárolása legfeljebb 4GB méretben.
BFILE Mutató egy bináris állományra.
Lássunk néhány megfeleltetést a MS SQL Server adattípusaival.
SQL Server 2000 adattípusai Oracle adattípusai
bigint NUMBER
binary LONG RAW NOT NULL
bit NUMBER(1,0)
char VARCHAR2(900) NOT NULL
datetime DATE
decimal NUMBER(255,3) NOT NULL
float FLOAT NOT NULL
image LONG RAW
int NUMBER(255,3) NOT NULL
money NUMBER(255,3) NOT NULL
nchar VARCHAR2(2000) NOT NULL
ntext LONG
numeric NUMBER(255,3) NOT NULL
nvarchar VARCHAR2(2000) NOT NULL
real FLOAT NOT NULL
smallint NUMBER(255,3) NOT NULL
smalldatetime DATE NOT NULL
smallmoney NUMBER(255,3) NOT NULL
sql_variant LONG
sysname CHAR(255)
text LONG
timestamp RAW(255)
tinyint NUMBER(255,3) NOT NULL
A lista tovább szűkül, ha figyelembe vesszük, hogy a Delphi rendszerben milyen módon érhetjük el Oracle adatbázisunkat. Az adatbázis az ADO (ActiveX Data Objects) provider-ét használja, melyet az ADOdb egység reprezentál. Ennek megfelelően a támogatott típusok: NUMBER, CHAR, VARCHAR, VARCHAR2, DATE.
Gyakorlati felhasználás
A mellékelt példában az Oracle02.sql script lefuttatása után létrejön egy Table2 adattábla. A táblába a Form-ra felhelyezett Edit kontrolokon keresztül lehet új rekordokat beszúrni, meglévő rekordokat módosítani, valamint törölni. A művelet egy ComboBox kontrolban válaszható ki.
Az adatbázis eléréséhez felhasználtunk egy TADOConnection típusú komponenst, melynek ConnectionString property-jét kapcsolódáskor töltjük fel. A szerver neve természetesen az a név, melyen megtalálható a SOUSER felhasználó. A program indításakor a „Kapcsolódás” feliratú gomb lenyomásával lehet kapcsolatot teremteni az adatbázissal. Az adatokat egy TADODataSet típusú komponensbe gyűjtjük. A Form-ra helyezett DBGrid kontrolban azonnal követhetőek az adattáblán végzett módosítások. A kapcsolat Connectionstring property-je:
DM.oraConnect.ConnectionString := 'Provider=MSDAORA.1;Password=souser;User ID=souser;Data Source=soserver';
Az adatelérési komponensek közé felvettünk egy TADOCommand típusú komponenst, melynek CommandText property-je tartalmazza az adott utasítás karakterláncát. A property értéke rekordok beszúrásakor a következő:
DM.oraCommand.CommandText := 'INSERT INTO Table2 VALUES (' + id.Text + ',''' + name.Text + ''',''' + desc.Text + ''',TO_DATE(''' + s + ''',''YYYY.MM.DD.''))';
Rekordok módosításakor:
DM.oraCommand.CommandText := 'UPDATE Table2 SET NAME = ''' + name.Text + ''',DESCRIPTION = ''' + desc.Text + ''',REG_DATE = TO_DATE(''' + s + ''',''YYYY.MM.DD.'')';
DM.oraCommand.CommandText := DM.oraCommand.CommandText + ' WHERE (ID = ' + id.Text + ')';
Törléskor pedig:
DM.oraCommand.CommandText :=  'DELETE FROM Table2 WHERE ID = ' + id.Text;
A DATE típusú oszlop adatainak bevitele és módosítása némi magyarázatot igényelhet. Az ilyen típusú adatok megadásakor használnunk kell egy TO_DATE nevű beépített függvényt, melynek első paramétere tartalmazza a rögzítendő dátumot karakteresen, második paramétere pedig azt a karakterlánc-mintát, amilyen formátumban a dátumot megadtuk az első paraméterben. Bármilyen különbség illeszkedési-hibát okoz.
A dátum megadásakor azt a módot választottuk, hogy egy TDateTimePicker kontrolban választjuk ki a dátumot, melynek visszaadatott dátum-értékét karakterlánccá konvertáljuk, majd ezt adjuk meg a TO_DATE függvény első paramétereként. A függvény második paraméterét pedig ehhez a formátumhoz igazítjuk, mely most „YYYY.MM.DD.” lesz.

Oracle adatbázis-kezelés cikksorozat