Professional Documents
Culture Documents
PLSQL
PLSQL
Što je PL/SQL?
Oracle PL / SQL je proširenje SQL jezika koji kombinira snagu SQL-a za rukovanje podacima s
procesorskom snagom proceduralnog jezika za stvaranje super moćnih SQL upita. PL/SQL osigurava
besprijekornu obradu SQL naredbi poboljšavanjem sigurnosti, prenosivosti i robusnosti baze
podataka.
PL/SQL znači davanje uputa kompajleru 'što da radi' kroz SQL i 'kako da radi' kroz njegov
proceduralni način. Slično ostalim jezicima baza podataka, daje više kontrole programerima
korištenjem petlji, uvjeta i objektno orijentiranih concepts. PL/SQL puni obrazac je “proširenja
proceduralnog jezika za SQL”.
Nedostaci PL/SQL
1. Pohranjene procedure u PL/SQL-u koriste veliku količinu memorije
2. Nedostaje otklanjanje pogrešaka u funkcionalnosti u pohranjenim procedurama
3. Svaka promjena u osnovnoj bazi podataka također zahtijeva promjenu u prezentacijskom
sloju
4. Ne odvaja u potpunosti uloge back-end programera i front-end programera
2
Blok struktura
PL/SQL blokovi imaju unaprijed definiranu strukturu u kojoj se kod grupira. Ispod su različiti dijelovi
PL/SQL blokova.
1. Odjeljak deklaracije
2. Izvršni dio
3. Odjeljak za rukovanje iznimkama
35:04
Odjeljak deklaracije
Ovo je prvi odjeljak PL/SQL blokova. Ovaj odjeljak je neobavezan dio. Ovo je odjeljak u kojem će se
deklarirati deklaracija varijabli, kursora, izuzetaka, potprograma, pragma instrukcija i kolekcija koje su
potrebne u bloku. Ispod je još nekoliko karakteristika ovog dijela.
Ovaj određeni odjeljak nije obavezan i može se preskočiti ako nisu potrebne deklaracije.
Ovo bi trebao biti prvi odjeljak u PL/SQL bloku, ako postoji.
Ovaj odjeljak počinje ključnom riječi 'DECLARE' za okidače i anonimni blok. Za ostale
potprograme ova ključna riječ neće biti prisutna. Umjesto toga, dio nakon definicije naziva
potprograma označava odjeljak deklaracije.
Nakon ovog odjeljka uvijek treba slijediti odjeljak za izvršenje.
Odjel za izvršenje
Izvršni dio je glavni i obvezni dio koji zapravo izvršava kod koji je napisan unutar njega. Budući da
je PL / SQL očekuje izvršne naredbe iz ovog bloka, to ne može biti prazan blok, tj. trebao bi sadržavati
barem jednu važeću liniju izvršnog koda u sebi. Ispod je još nekoliko karakteristika ovog dijela.
Ovo može sadržavati i PL/SQL kod i SQL kod.
3
To može sadržavati jedan ili više blokova unutar sebe kao ugniježđeni blok.
Ovaj odjeljak počinje ključnom riječi 'BEGIN'.
Nakon ovog odjeljka treba slijediti ili 'KRAJ' ili odjeljak za rukovanje iznimkama (ako postoji)
Odjeljak za rukovanje iznimkama
Iznimka je neizbježna u programu koji se pojavljuje tijekom izvođenja i rješavanju toga Oracle je
osigurao odjeljak za rukovanje iznimkama u blokovima. Ovaj odjeljak također može sadržavati PL/SQL
izjave. Ovo je izborni odjeljak PL/SQL blokova.
Ovo je odjeljak u kojem se obrađuje iznimka pokrenuta u bloku izvršenja.
Ovaj odjeljak je zadnji dio PL/SQL bloka.
Kontrola iz ove sekcije nikada se ne može vratiti u izvršni blok.
Ovaj odjeljak počinje ključnom riječi 'IZUZETAK'.
Nakon ovog odjeljka uvijek treba slijediti ključna riječ 'KRAJ'.
Ključna riječ 'END' označava kraj PL/SQL bloka.
Bilješka: Iza bloka bi uvijek trebao biti '/' koji šalje informaciju kompajleru o kraju bloka.
Ovi blokovi mogu imati sva tri odjeljka bloka, u kojem je dio za izvođenje obavezan, a druga
dva odjeljka su izborna.
Imenovani blokovi
Imenovani blokovi imaju specifično i jedinstveno ime za sebe. Oni su pohranjeni kao objekti baze
podataka na poslužitelju. Budući da su dostupni kao objekti baze podataka, na njih se može pozivati ili
ih koristiti sve dok su prisutni na poslužitelju. Proces kompilacije za imenovane blokove odvija se
odvojeno tijekom njihovog stvaranja kao objekata baze podataka.
Ispod je još nekoliko karakteristika imenovanih blokova.
Ovi blokovi se mogu pozvati iz drugih blokova.
Struktura bloka je ista kao kod anonimnog bloka, osim što nikada neće započeti ključnom
riječi 'DECLARE'. Umjesto toga, počet će s ključnom riječi 'CREATE' koja nalaže kompajleru
da ga stvori kao objekt baze podataka.
Ovi blokovi mogu biti ugniježđeni unutar drugih blokova. Također može sadržavati
ugniježđene blokove.
Imenovani blokovi su u osnovi dvije vrste:
1. Postupak
2. funkcija
Naučit ćemo više o tim imenovanim blokovima u temama "Procedura" i "Funkcija" u later udžbenik.
Objašnjenje koda:
Kodna linija 2: Ispisuje poruku “Hello World. . .”
Objašnjenje koda:
5
Komentari u PL/SQL
Komentiranje koda jednostavno upućuje kompilator da zanemari taj određeni kod od izvršavanja.
Komentar se može koristiti u programu za povećanje čitljivosti programa. U PL/SQL kodovi se mogu
komentirati na dva načina.
Korištenje '–' na početku retka za komentiranje tog određenog retka.
Korištenjem '/*…….*/' možemo koristiti više redaka. Simbol '/*' označava početak komentara,
a simbol '*/' označava kraj komentara. Kod između ova dva simbola kompajler će tretirati kao
komentare.
Primjer: U ovom primjeru ispisat ćemo 'Hello World' i također ćemo vidjeti kako se komentirani redovi
ponašaju u kodu
/
Objašnjenje koda:
Redak koda 2: Deklaracija varijable 'a' kao tipa podataka 'BROJ' i njeno inicijaliziranje s
vrijednošću '10'.
Redak koda 4: Ispis izjave “Program je pokrenut”.
Redak koda 5: Provjera uvjeta, je li varijabla 'a' veća od '100.'
Redak koda 6: Ako je 'a' veće od '100', tada će se ispisati "a je veće od 100". Ako je 'a' manje
od ili jednako 100, tada uvjet ne ispunjava, tako da se gornji iskaz za ispis zanemaruje.
Redak koda 8: Ispis izjave "Program dovršen".
Izlaz koda:
Program started.
Program completed.
Primjer 2: U ovom primjeru, ispisat ćemo poruku ako je zadana abeceda prisutna u engleskim
samoglasnicima (A, E, I, O, U).
DECLARE
a CHAR(1) :=’u’;
BEGIN
IF UPPER(a) in ('A’,'E','I','0','U' ) THEN
dbms_output.put_line(‘The character is in English Vowels');
END IF;
END;
/
Objašnjenje koda:
Redak koda 2: Deklaracija varijable 'a' kao 'CHAR' tipa podataka veličine '1' i njeno
inicijaliziranje s vrijednošću 'u'.
Redak koda 4: Provjera uvjeta, da li je varijabla 'a' prisutna u listi ('A','E','I','O','U').
Vrijednost 'a' pretvorena je u velika slova prije usporedbe kako bi usporedba bila neosjetljiva
na velika i mala slova.
Redak koda 5: Ako je 'a' prisutan na popisu, tada će se ispisati izjava "Znak je u engleskim
samoglasnicima". Ako uvjet nije uspio, tada ovaj program neće dati nikakav izlaz, budući da
izvan bloka IF-THEN nismo izdali nikakvu naredbu za ispis.
Izlaz koda:
The character is in English Vowels
Izjava IF-THEN-ELSE
Izjava IF-THEN-ELSE uglavnom se koristi za odabir između dvije alternative na temelju
uvjeta.
Ispod je prikaz sintakse izjave IF-THEN-ELSE.
Sintaksa za izjave IF-THEN-ELSE:
IF <condition: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_blockl>
ELSE
-execute if the condition failed (returns FALSE)
<action_block2>
END if;
U gornjoj sintaksi, ključna riječ 'IF' će biti popraćena uvjetom koji daje vrijednost
'TRUE'/'FALSE'.
Kontrola će izvršiti samo ako se stanje vrati .
U slučaju stanja procjenjuje na tada će se SQL izvršiti .
U svakom slučaju, izvršit će se jedan od dva akcijska bloka.
Bilješka: Kad god se uvjet ocijeni kao 'NULL', tada će SQL tretirati 'NULL' kao 'FALSE'.
7
Primjer 1: U ovom primjeru ispisat ćemo poruku bez obzira na to je li navedeni broj neparan ili
paran.
DECLARE
a NUMBER:=11;
BEGIN
dbms_output.put_line (‘Program started');
IF( mod(a,2)=0) THEN
dbms_output.put_line('a is even number' );
ELSE
dbms_output.put_line('a is odd number1);
END IF;
dbms_output.put_line (‘Program completed.’);
END;
/
Objašnjenje koda:
Redak koda 2: Deklaracija varijable 'a' kao tipa podataka 'BROJ' i njeno inicijaliziranje s
vrijednošću '11'.
Redak koda 4: Ispis izjave “Program je pokrenut”.
Redak koda 5: Provjera uvjeta je li modul varijable 'a' prema '2' jednak 0.
Redak koda 6: Ako je '0', tada će se ispisati "a je paran broj".
Redak koda 7: Ako vrijednost modula nije jednaka '0', tada se vraća uvjet , pa će se ispisati
poruka "a je neparan broj".
Redak koda10: Ispis izjave "Program dovršen"
Izlaz koda:
Program started.
a is odd number
Program completed.
Izjava IF-THEN-ELSIF
Izjava IF-THEN-ELSIF uglavnom se koristi kada treba izabrati jednu alternativu iz skupa
alternativa, gdje svaka alternativa ima svoje uvjete koje treba zadovoljiti.
Prvi uvjeti koji se vraćaju će se izvršiti, a preostali uvjeti će biti preskočeni.
Izjava IF-THEN-ELSIF može sadržavati blok 'ELSE' u sebi. Ovaj 'ELSE' blok će se izvršiti ako
niti jedan od uvjeta nije zadovoljen.
bilješke: ELSE blok je neobavezan u ovoj uvjetnoj izjavi. Ako nema bloka ELSE i niti jedan od uvjeta
nije zadovoljen, kontroler će preskočiti sve akcijske blokove i započeti s izvršavanjem preostalog dijela
koda.
Sintaksa za IF-THEN-ELSIF izjave:
IF <conditionl: returns Boolean>
THEN
-executed only if the condition returns TRUE <
action_blockl>
ELSIF <condition2 returns Boolean> <
action_block2>
ELSIF <condition3:returns Boolean> <
action_block3>
ELSE —optional
<action_block_else>
END if;
U gornjoj sintaksi, kontrola će izvršiti samo ako se uvjet1 vrati .
Ako uvjet1 nije zadovoljen, regulator će provjeriti uvjet2.
Kontroler će izaći iz IF-naredbe u nastavkuwing dva slučaja.
Kada kontroler pronađe bilo koji uvjet koji se vraća . U tom slučaju, izvršit će se odgovarajući
action_block i kontroler će izaći iz ovog bloka IF-naredbe i započet će izvršavanje preostalog
koda.
8
Kada niti jedan od uvjeta nije zadovoljen, then kontroler će izvršiti ELSE blok ako postoji, a
zatim će izaći iz IF-naredbe.
Bilješka: Kad god se uvjet ocijeni kao 'NULL', tada će SQL tretirati 'NULL' kao 'FALSE'.
Primjer 1: Bez bloka ELSE
U ovom primjeru ispisat ćemo ocjenu na temelju zadanih ocjena bez drugih uvjeta (oznaka >= 70
ocjena A, ocjena >=40 i ocjena <70 ocjena B, ocjena >=35 i ocjena <40 ocjena C).
DECLARE
mark NUMBER :=55;
BEGIN
dbms_output.put_line(‘Program started.’ );
IF( mark >= 70) THEN
dbms_output.put_line(‘Grade A’);
ELSIF(mark >= 40 AND mark < 70) THEN
dbms_output.put_line(‘Grade B');
ELSIF(mark >=35 AND mark < 40) THEN
dbms_output.put_line(‘Grade C’);
END IF;
dbms_output.put_line(‘Program completed.’);
END;
/
Objašnjenje koda:
Redak koda 2: Deklaracija varijable 'oznaka' kao tipa podataka 'BROJ' i njeno inicijaliziranje s
vrijednošću '55'.
Redak koda 4: Ispis izjave “Program je pokrenut”.
Redak koda 5: Provjera uvjeta1, je li 'oznaka' veća ili jednaka 70.
Redak koda 7: Budući da uvjet1 nije uspio, provjerava se uvjet2 '70>oznaka>=40′.
Redak koda 8: Condtition2 se vraća , stoga će se ispisati poruka 'Ocjena B'.
Redak koda12: Ispis izjave "Program dovršen".
U ovom slučaju, uvjet3 'oznaka < 35' bit će preskočen, jer je kontroler pronašao jedan uvjet
koji vraća prije uvjeta3.
Izlaz koda:
Program started.
Grade B
Program completed.
Primjer 2: S blokom ELSE
U ovom primjeru ispisat ćemo ocjenu na temelju zadanih ocjena s drugim uvjetom (oznaka >= 70
ocjena A, ocjena >=40 i ocjena <70 ocjena B, ocjena >=35 i oznaka <40 ocjena C, inače 'Bez ocjene').
DECLARE
mark NUMBER :=25;
BEGIN
dbms_output.put_line(‘Program started.’ );
IF( mark >= 70) THEN
dbms_output.put_line(‘Grade A’);
ELSIF(mark >= 40 AND mark < 70) THEN
dbms_output.put_line(‘Grade B');
ELSIF(mark >=35 AND mark < 40) THEN
dbms_output.put_line(‘Grade C);
ELSE
dbms_output.put_line(‘No Grade’);
END IF;
dbms_output.put_line(‘Program completed.' );
END;
/
Objašnjenje koda:
Redak koda 2: Deklaracija varijable 'oznaka' kao tipa podataka 'BROJ' i njeno inicijaliziranje s
vrijednošću '25'.
9
00:12
35:04
Objašnjenje sintakse:
U gornjoj sintaksi ključna riječ 'LOOP' označava početak petlje, a 'END LOOP' označava kraj
petlje.
Izvršni blok sadrži sav kod koji se treba izvršiti uključujući uvjet EXIT.
Izvršni dio može sadržavati bilo koju naredbu o izvršenju.
Bilješka: Osnovna naredba petlje bez ključne riječi EXIT bit će BESKONAČNA PETLJA koja se
nikada neće zaustaviti.
Primjer 1: U ovom primjeru ispisat ćemo brojeve od 1 do 5 koristeći osnovnu naredbu petlje. Za to
ćemo izvršiti following kodirati.
11
Označavanje petlji
U PL/SQL, petlje se mogu označiti. Oznaka treba biti između “<<” i “>>”. Označavanje petlji, posebno
u kodovima ugniježđenih petlji, omogućit će veću čitljivost. Oznaka se može dati u naredbi EXIT za
izlaz iz te određene petlje. Korištenjem oznake, kontrola se može izvesti tako da izravno izađe iz
vanjske petlje ugniježđenih petlji s bilo kojeg mjesta unutar petlji, davanjem naredbe za izlaz nakon
koje slijedi oznaka vanjske petlje.
Objašnjenje sintakse:
U gornjoj sintaksi, izlazna petlja ima još jednu petlju unutar sebe.
'< >' i '< >' su oznake ovih petlji.
Primjer 1: U ovom primjeru ispisat ćemo broj počevši od 1 koristeći osnovnu naredbu petlje. Svaki će
se broj ispisati onoliko puta koliko iznosi njegova vrijednost. Gornja granica niza je fiksirana u dijelu
deklaracije programa. Naučimo kako možemo koristiti koncept oznake da to postignemo. Za to ćemo
izvršiti following kod
12
Objašnjenje koda:
Redak koda 2-3: Deklaracija varijabli 'a' i 'b' kao tipa podataka 'BROJ'.
Kodna linija 4: Deklaracija varijable 'upper_limit' kao tipa podataka 'NUMBER' s vrijednošću
'4'
Kodna linija 6: Ispis izjave “Program je pokrenut”.
Redak koda 7: Vanjska petlja je označena kao "outer_loop"
Redak koda 9: Vrijednost 'a' se povećava za 1.
Redak koda 11: Unutarnja petlja je označena kao "unutarnja petlja".
Redak koda 13: EXIT uvjet koji provjerava je li vrijednost 'a' viša od vrijednosti 'upper_limit'.
Ako ne, onda će ići dalje, inače izlazi izravno iz vanjske petlje.
Redak koda 14: Ispis vrijednosti 'b'.
Redak koda 15: Povećava vrijednost 'b' za +1.
Redak koda 16: EXIT uvjet koji provjerava je li vrijednost 'b' veća od 'a'. Ako je tako, tada će
izaći iz kontrole unutarnje petlje.
Redak koda 14: Ispis izjave "Program završen"
Brisanje podataka
Odabir podataka
U PL/SQL-u možemo manipulirati podacima samo pomoću SQL naredbi.
Umetanje podataka
U PL/SQL možemo umetnuti podatke u bilo koju tablicu pomoću SQL naredbe INSERT INTO. Ova
naredba će uzeti naziv tablice, stupac tablice i vrijednosti stupaca kao ulaz i umetnuti vrijednost u
osnovnu tablicu.
Naredba INSERT također može preuzeti vrijednosti izravno iz druge tablice pomoću izjave 'SELECT'
umjesto davanja vrijednosti za svaki stupac. Preko naredbe 'SELECT' možemo umetnuti onoliko
redaka koliko sadrži osnovna tablica.
Sintaksa:
BEGIN
INSERT INTO <table_name>(<column1 >,<column2>,...<column_n>)
VALUES(<valuel><value2>,...:<value_n>);
END;
Gornja sintaksa prikazuje naredbu INSERT INTO. Naziv tablice i vrijednosti obavezna su
polja, dok nazivi stupaca nisu obavezni ako naredbe za umetanje imaju vrijednosti za sve
stupce tablice.
Ključna riječ 'VRIJEDNOSTI' obavezna je ako su vrijednosti dane zasebno kao što je gore
prikazano.
Sintaksa:
BEGIN
INSERT INTO <table_name>(<columnl>,<column2>,...,<column_n>)
SELECT <columnl>,<column2>,.. <column_n> FROM <table_name2>;
END;
Gornja sintaksa prikazuje naredbu INSERT INTO koja preuzima vrijednosti izravno iz pomoću
naredbe SELECT.
Ključna riječ 'VRIJEDNOSTI' ne bi trebala biti prisutna u ovom slučaju jer se vrijednosti ne
daju zasebno.
Ažuriranje podataka
Ažuriranje podataka jednostavno znači ažuriranje vrijednosti bilo kojeg stupca u tablici. To se može
učiniti pomoću izjave 'UPDATE'. Ova izjava uzima naziv tablice, naziv stupca i vrijednost kao ulaz i
ažurira podatke.
Sintaksa:
BEGIN
UPDATE <table_name>
SET <columnl>=<VALUE1>,<column2>=<value2>,<column_n>=<value_n>
WHERE <condition that uniquely identifies the record that needs to be update>;
END;
Gornja sintaksa prikazuje AŽURIRANJE. Ključna riječ 'SET' upućuje taj PL/SQL stroj da
ažurira vrijednost stupca danom vrijednošću.
Klauzula 'WHERE' nije obavezna. Ako ova klauzula nije dana, ažurirat će se vrijednost
navedenog stupca u cijeloj tablici.
Brisanje podataka
Brisanje podataka znači brisanje jednog cijelog zapisa iz tablice baze podataka. U tu svrhu koristi se
naredba 'DELETE'.
Sintaksa:
BEGIN
DELETE
FROM
<table_name>
WHERE <condition that uniquely identifies the record that needs to be update>;
END;
14
Gornja sintaksa prikazuje naredbu DELETE. Ključna riječ 'FROM' nije obavezna i sa ili bez
klauzule 'FROM' naredba se ponaša na isti način.
Klauzula 'WHERE' nije obavezna. Ako ova klauzula nije navedena, cijela tablica će biti
izbrisana.
Odabir podataka
Projekcija/dohvaćanje podataka znači dohvaćanje potrebnih podataka iz tablice baze podataka. To se
može postići korištenjem naredbe 'SELECT' s klauzulom 'INTO'. Naredba 'SELECT' dohvatit će
vrijednosti iz baze podataka, a klauzula 'INTO' dodijelit će te vrijednosti lokalnoj varijabli PL/SQL blok.
Ispod su točke koje treba uzeti u obzir u izjavi 'SELECT'.
Naredba 'SELECT' trebala bi vratiti samo jedan zapis dok se koristi klauzula 'INTO' jer jedna
varijabla može sadržavati samo jednu vrijednost. Ako naredba 'SELECT' vrati više od jedne
vrijednosti, pokrenut će se iznimka 'TOO_MANY_ROWS'.
Naredba 'SELECT' dodijelit će vrijednost varijabli u klauzuli 'INTO', tako da treba dobiti barem
jedan zapis iz tablice za popunjavanje vrijednosti. Ako nije dobio nikakav zapis, pokreće se
iznimka 'NO_DATA_FOUND'.
Broj stupaca i njihov tip podataka u klauzuli 'SELECT' trebao bi odgovarati broju varijabli i
njihovim tipovima podataka u klauzuli 'INTO'.
Vrijednosti se dohvaćaju i popunjavaju istim redoslijedom kako je navedeno u izjavi.
Klauzula 'WHERE' nije obvezna i omogućuje veća ograničenja zapisa koji će se dohvaćati.
Izjava 'SELECT' može se koristiti u uvjetu 'WHERE' drugih DML izjava za definiranje
vrijednosti uvjeta.
Naredba 'SELECT' kada se koriste naredbe 'INSERT', 'UPDATE', 'DELETE' ne bi trebala imati
klauzulu 'INTO' jer u tim slučajevima neće popuniti nijednu varijablu.
Sintaksa:
BEGIN
SELECT <columnl>,..<column_n> INTO <vanable 1 >,. .<variable_n>
FROM <table_name>
WHERE <condition to fetch the required records>;
END;
Gornja sintaksa prikazuje naredbu SELECT-INTO. Obavezna je ključna riječ 'FROM' koja
identificira naziv tablice iz koje se podaci trebaju dohvatiti.
Klauzula 'WHERE' nije obavezna. Ako ova klauzula nije navedena, tada će se dohvatiti podaci
iz cijele tablice.
Primjer 1: U ovom primjeru ćemo vidjeti kako izvesti DML operacije u PL / SQL. Umetnut ćemo donja
četiri zapisa u emp tablicu.
EMP_NAME EMP_NO PLAĆA MANAGER
BBB 1000 25000 AAA
XXX 1001 10000 BBB
GGG 1002 10000 BBB
ZZZ 1003 7500 BBB
Zatim ćemo ažurirati plaću 'XXX' na 15000 i izbrisati evidenciju zaposlenika 'ZZZ'. Konačno, projicirati
ćemo details zaposlenika 'XXX'.
15
Izlaz:
Values Inserted
Values Updated
Values Deleted
Employee Detail
Employee Name:XXX
Employee Number:1001
Employee Salary:15000
Employee Manager Name:BBB
Objašnjenje koda:
Redak koda 2-5: Deklaracija varijable.
Redak koda 7-14: Umetanje zapisa u emp tablicu.
Kodna linija 15: Izvršavanje transakcija umetanja.
Redak koda 17-19: Ažuriranje plaće zaposlenika 'XXX' na 15000
Kodna linija 20: Izvršavanje transakcije ažuriranja.
Kodna linija 22: Brisanje zapisa 'ZZZ'
Kodna linija 23: Izvršavanje transakcije brisanja.
Redak koda 25-27: Odabir zapisa 'XXX' i popunjavanje u varijablu l_emp_name, l_emp_no,
l_salary, l_manager.
Redak koda 28-32: Prikaz dohvaćene vrijednosti zapisa.
Prednosti okidača
Automatsko generiranje nekih izvedenih vrijednosti stupaca
Provođenje referencijalnog integriteta
Zapisivanje događaja i pohranjivanje informacija o pristupu tablici
Revizija
Synchronološka replikacija tablica
Nametanje sigurnosnih ovlaštenja
Sprječavanje nevažećih transakcija
Vrste okidača u Oracle
Okidači se mogu klasificirati na temelju sljedećeg
Klasifikacija na temelju Vrijeme
PRIJE Okidač: Aktivira se prije nego se dogodi navedeni događaj.
Okidač NAKON: Aktivira se nakon što se dogodi navedeni događaj.
UMJESTO Okidača: Posebna vrsta. Saznat ćete više o daljnjim temama. (samo za DML)
Klasifikacija na temelju nivo
Okidač razine STATEMENT: aktivira se jednom za navedenu naredbu događaja.
Okidač razine ROW: aktivira se za svaki zapis koji je zahvaćen navedenim događajem.
(samo za DML)
Klasifikacija na temelju događaj
DML okidač: aktivira se kada je naveden DML događaj (INSERT/UPDATE/DELETE)
DDL okidač: aktivira se kada je naveden DDL događaj (CREATE/ALTER)
Okidač BAZE PODATAKA: pokreće se kada je naveden događaj baze podataka
(PRIJAVA/ODJAVA/POKRETANJE/GAŠENJE)
Kako stvoriti okidač
Ispod je sintaksa za stvaranje okidača.
Objašnjenje sintakse:
Gornja sintaksa prikazuje različite neobavezne izjave koje su prisutne u stvaranju okidača.
PRIJE/ POSLIJE odredit će vrijeme događaja.
INSERT/UPDATE/PRIJAVA/KREIRANJE/itd. odredit će događaj za koji se okidač treba
aktivirati.
ON klauzula će odrediti na kojem je objektu gore spomenuti događaj valjan. Na primjer, ovo
će biti naziv tablice na kojoj se može dogoditi DML događaj u slučaju DML okidača.
Naredba “ZA SVAKI RED” odredit će okidač razine REDA.
WHEN klauzula navest će dodatni uvjet u kojem se okidač treba aktivirati.
Dio za deklaraciju, dio za izvođenje, dio za rukovanje iznimkama isti je kao onaj kod
ostalih PL/SQL blokovi. Deklaracijski dio i dio za rukovanje iznimkama nisu obavezni.
U okidaču na razini retka, okidač se aktivira za svaki povezani redak. A ponekad je potrebno znati
vrijednost prije i poslije DML izjave.
Oracle je osigurao dvije klauzule u okidaču na razini RECORD za držanje ovih vrijednosti. Ove
klauzule možemo koristiti za pozivanje na stare i nove vrijednosti unutar tijela okidača.
:NEW – Sadrži novu vrijednost za stupce osnovne tablice/pogleda tijekom izvršenja okidača
:OLD – Zadržava staru vrijednost stupaca osnovne tablice/pogleda tijekom izvršavanja
okidača
Ovu klauzulu treba koristiti na temelju DML događaja. Donja tablica će odrediti koja je klauzula važeća
za koju DML izjavu (INSERT/UPDATE/DELETE).
INSERT UPDATE DELETE
NEVAŽEĆE. Nema nove
:NOVI VRIJEDI VRIJEDI vrijednosti u brisanju velikih i
malih slova.
NEVAŽEĆE. U umetnutom
:STAR VRIJEDI VRIJEDI
slučaju nema stare vrijednosti
UMJESTO Okidač
“UMJESTO okidača” je posebna vrsta okidača. Koristi se samo u DML okidačima. Koristi se kada će
se na com dogoditi bilo koji DML događajplex pogled.
Razmotrite primjer u kojem je pogled napravljen od 3 osnovne tablice. Kada se preko ovog prikaza
izda bilo koji DML događaj, on će postati nevažeći jer su podaci preuzeti iz 3 različite tablice. Dakle, u
ovom se koristi okidač INSTEAD OF. Okidač INSTEAD OF koristi se za izravnu izmjenu osnovnih
tablica umjesto za izmjenu pogleda za dati događaj.
Primjer 1: U ovom primjeru, mi ćemo stvoriti complex pogled sa stola s dvije baze.
Table_1 je prazna tablica i
Tablica_2 je tablica odjela.
Zatim ćemo vidjeti kako se okidač INSTEAD OF koristi za izdavanje UPDATE izjave o detaljima
lokacije na ovom com-uplex pogled. Također ćemo vidjeti kako su :NEW i :OLD korisni u okidačima.
Korak 1: Stvaranje tablice 'emp' i 'dept' s odgovarajućim stupcima
Korak 2: Popunjavanje tablice uzorcima vrijednosti
Korak 3: Stvaranje prikaza za gore stvorenu tablicu
Korak 4: ažuriranje prikaza prije okidača umjesto
Korak 5: Stvaranje okidača umjesto
Korak 6: ažuriranje prikaza nakon okidača umjesto umjesto
Korak 1) Izrada tablice 'emp' i 'dept' s odgovarajućim stupcima
18
Objašnjenje koda
Redak koda 1-7: Stvaranje tablice 'emp'.
Redak koda 8-12: Stvaranje tablice 'dept'.
Izlaz
Tablica je stvorena
Korak 2) Budući da smo izradili tablicu, popunit ćemo ovu tablicu oglednim vrijednostima i stvaranjem
prikaza za gornje tablice.
Objašnjenje koda
Redak koda 13-19: Umetanje podataka u 'dept' tablicu.
Redak koda 20-26: Umetanje podataka u 'emp' tablicu.
Izlaz
PL/SQL postupak dovršen
Korak 3) Izrada prikaza za gore stvorenu tablicu.
19
Objašnjenje koda
Redak koda 27-32: Izrada pogleda 'guru99_emp_view'.
Redak koda 33: Upit guru99_emp_view.
Izlaz
Prikaz stvoren
IME ZAPOSLENIKA DEPT_NAME LOKACIJA
ZZZ HR SAD
GGG SALES UK
XXX FINANCIJSKA JAPAN
Korak 4) Ažuriranje prikaza prije umjesto okidača.
Objašnjenje koda
Redak koda 34-38: Ažurirajte lokaciju "XXX" u "FRANCUSKA". Pokrenula je iznimku jer DML
izjave nisu dopušteni u komplex pogled.
Izlaz
ORA-01779: nije moguće modificirati stupac koji se preslikava na tablicu bez očuvanja ključa
ORA-06512: u retku 2
Korak 5)Kako bismo izbjegli pojavu pogreške tijekom ažuriranja prikaza u prethodnom koraku, u ovom
ćemo koraku koristiti "umjesto okidača".
20
Objašnjenje koda
Redak koda 39: Stvaranje okidača INSTEAD OF za događaj 'UPDATE' na prikazu
'guru99_emp_view' na razini ROW. Sadrži izjavu o ažuriranju za ažuriranje lokacije u
osnovnoj tablici 'dept'.
Redak koda 44: Naredba ažuriranja koristi ':NEW' i ':OLD' za pronalaženje vrijednosti stupaca
prije i nakon ažuriranja.
Izlaz
Okidač je stvoren
Korak 6) Ažuriranje prikaza nakon okidača umjesto okidača. Sada se pogreška neće pojaviti jer će
"umjesto okidača" upravljati ažuriranjem operacija ove komplex pogled. A kada se kôd izvrši, lokacija
zaposlenika XXX bit će ažurirana u "Francuska" iz "Japana".
Objašnjenje koda:
Redak koda 49-53: Ažuriranje lokacije "XXX" u "FRANCUSKA". Uspješan je jer je okidač
'UMJESTO'' zaustavio stvarni izraz ažuriranja na prikazu i izvršio ažuriranje osnovne tablice.
Redak koda 55: Provjera ažuriranog zapisa.
Izlaz:
PL/SQL procedura uspješno završena
IME ZAPOSLENIKA DEPT_NAME LOKACIJA
ZZZ HR SAD
GGG SALES UK
XXX FINANCIJSKA FRANCUSKA
Složeni okidač
Složeni okidač je okidač koji vam omogućuje određivanje radnji za svaku od četiri vremenske točke u
jednom tijelu okidača. Četiri različite vremenske točke koje podržava su sljedeće.
21
Objašnjenje sintakse:
Gornja sintaksa prikazuje stvaranje okidača 'COMPOUND'.
Deklarativni odjeljak zajednički je za sve izvršne blokove u tijelu okidača.
Ova 4 vremenska bloka mogu biti u bilo kojem nizu. Nije obavezno imati sva ova 4 vremenska
bloka. Možemo stvoriti COMPOUND okidač samo za vremena koja su potrebna.
Primjer 1: U ovom primjeru stvorit ćemo okidač za automatsko popunjavanje stupca plaće zadanom
vrijednošću 5000.
22
Objašnjenje koda:
Redak koda 2-10: Stvaranje složenog okidača. Stvoren je za mjerenje vremena PRIJE
RETKA na razini za popunjavanje plaće sa zadanom vrijednošću 5000. Ovo će promijeniti
plaću na zadanu vrijednost '5000' prije umetanja zapisa u tablicu.
Redak koda 11-14: Umetnite zapis u 'emp' tablicu.
Kodna linija 16: Provjera umetnutog zapisa.
Izlaz:
Okidač je stvoren
PL/SQL procedura uspješno završena.
EMP_NAME EMP_NO PLAĆA MANAGER DEPT_BR
HGK 1004 5000 AAA 30
Omogućivanje i onemogućavanje okidača
Okidači se mogu omogućiti ili onemogućiti. Da biste omogućili ili onemogućili okidač, treba dati
naredbu ALTER (DDL) za okidač koji ga onemogućuje ili omogućuje.
Ispod je sintaksa za omogućavanje/onemogućavanje okidača.
ALTER TRIGGER <trigger_name> [ENABLE|DISABLE];
ALTER TABLE <table_name> [ENABLE|DISABLE] ALL TRIGGERS;
Objašnjenje sintakse:
Prva sintaksa pokazuje kako omogućiti/onemogućiti pojedinačni okidač.
Druga izjava pokazuje kako omogućiti/onemogućiti sve okidače na određenoj tablici.