Delphi - Szekvenciák használata

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

forráskód letöltése
A cikksorozat mai számában bemutatjuk, hogy miként hozhatunk létre szekvenciákat (SEQUENCE) az adott sémában. A mellékelt példában készített szekvencia felhasználásával lehetővé tesszük, hogy az adott adattáblába beszúrásra kerülő rekordok mindig eggyel magasabb indexszel rendelkezzenek, vagyis az egyik oszlop értékei mintegy automatikusan inkrementálódjanak.
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 Oracle13.sql nevű parancsállományt a hivatkozott további objektumok létrehozásához.
Szekvenciák
Az Oracle-rendszerben létrehozott adatbázisok tábláinak is rendelkezniük kell egy ID oszloppal, mely egyértelműen azonosítja a rekordokat, így elsődleges kulcsot képez a táblában. Az Oracle-ben van egy igen hasznos technika arra, hogy ezeknek az oszlopoknak az értékeit automatikusan növeljük anélkül, hogy a felhasználótól egy konkrét értéket kérnénk be. Ekkor minden egyes rekord beszúrásakor az ID oszlop értéke eggyel nagyobb lesz az előző rekord esetén adott értéknél. A mellékelt példában csak az INSERT műveletre mutatunk példát, azonban ennek ismeretében a DELETE művelet után elvégzendő procedúra megalkotható.
A szekvenciák generálása az, amelynek segítségével a fenti művelet egy trigger-rel kiegészítve megvalósítható. A mellékelt Oracle13.sql parancsállomány lefuttatása után ezen objektumok a SOUSER sémába bekerülnek, csupán használnunk kell azokat.
A szekvenciákat objektumként kezeli a rendszer, a DBA Studio segédalkalmazásban is megtekinthetjük jellemzőiket. Jellemzőjük, hogy kezdő értékkel, végértékkel rendelkeznek, valamint meg kell adni, hogy mekkora legyen a „lépésköz” az egyes ciklusokban. Szintaxisa a következő:
CREATE SEQUENCE [séma.]szekvencia_név opció(k)
Az opciók lehetek:
  • INCREMENT BY (egész): növelés mértéke
  • START WITH (egész): kezdőérték
  • MAXVALUE | NOMAXVALUE (egész): maximum érték
  • MINVALUE | NOMINVALUE (egész): minimum érték
  • CYCLE | NOCYCLE: ciklusos legyen a szekvencia
A létrehozott szekvenciában akkor kell megadni az opciókat, ha az alapértelmezéstől eltérő viselkedésre szeretnénk kényszeríteni azt. Példánkban a MYSEQ szekvenciát a következőképpen hoztuk létre:
CREATE SEQUENCE MYSEQ;
A szekvencia 1-től indul, maximális értéke nincs, hiszen a rekordok száma végtelen lehet. Amennyiben az alapértelmezéstől eltérő szekvenciát akarunk létrehozni, akkor a következőképpen kell megadnunk a szükséges opciókat:
create sequence seq1
start with 10
increment 10
maxvalue 150
cycle;
A szekvencia ekkor 10-től indul, 150-ig halad, és 10-es léptékben. A végéhez érve kezdi a ciklus elölről.
AutoIncrement oszlop
A példában úgy járunk el, hogy minden egyes rekordbeszúrás előtt kinyerjük a szekvencia következő értékét, melyet ezt követően az ID oszlop értékeként adunk meg. Ennek legjobb módja az, amikor ezt a műveletet egy BEFORE INDEX trigger-re bízzuk. A mellékelt parancsállományban a következő trigger végzi el ezt a műveletet. Ennek első sorában megadjuk, hogy minden sorra hajtódjon végre:
CREATE TRIGGER AUTOINC BEFORE INSERT ON Table1
FOR EACH ROW
Megadjuk azt a feltételt, melyre beindul a trigger végrehajtása. A feltétel az, hogy az INSERT művelet megadásakor az ID oszlop értékeként a NULL értéket kell megadnunk:
WHEN (NEW.ID IS NULL)
A trigger törzsében megadjuk, hogy a szekvencia következő értéke képzi az ID oszlop aktuális értékét:
BEGIN
 SELECT MYSEQ.nextval INTO :NEW.ID FROM dual;
END;
Ennek eredményeképpen az alkalmazásban az INSERT utasítás a következőképpen fest:
INSERT INTO TABLE1 VALUES(NULL,<adat>);

Oracle adatbázis-kezelés cikksorozat