
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:
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:
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>);