Documente Academic
Documente Profesional
Documente Cultură
Oracle permite constrangerilor de integritate sa fie definite pentru ta- bele si coloanelor sa
forteze reguli sigure, inauntrul unei tabele sau intre tabele.
Constrangerile sunt folosite:
• de serverul Oracle sa forteze reguli la nivelul tabelei oricand este inserata o linie,
actualizata sau stearsa din acea tabela. Constrangerea trebuie sa fie satisfacuta pentru ca
operatiile sa reuseasca.
• pentru a preveni stergerea unei tabele daca sunt posesiuni din alte tabele.
• prin unelte Oracle, ca Oracle Forms, pentru a furniza reguli pentru utilizarea intr-o
aplicatie.
Constrangerile sunt clasate dupa cum urmeaza:
Constrangeri de tabela
Acestea pot referi una sau mai multe coloane si sunt definite SEPARAT de definitiile
coloanelor din tabela.
Constrangeri de coloana
Acestea refera o singura coloana si sunt definite INAUNTRUL specificatiei pentru coloana
posesoare.
Constrangerile pot fi adaugate unei tabele dupa crearea ei si deasemenea temporar dezactivate
(vezi comanda ALTER TABLE in capitolul urmator).Toate detaliile despre constrangeri sunt
stocate in Dictionarul de Date. Fiecarei constrangeri ii este repartizat un nume. Iti este mai usor
sa suplimentezi una tu singur, astfel ca poate fi mai usor referita mai tarziu, dar daca nu, atunci
un nume este generat automat pe forma:
SYS_Cn
unde n este un numar unic. Cuvantul cheie CONSTRAINT iti permite sa numesti o noua
constrangere tu insuti.
Tipuri de constrangeri
Puteti defini urmatoarele tipuri de constrangeri:
• NULL/NOT NULL
• UNIQUE
• PRIMARY KEY
• FOREIGN KEY(integritatea de referinta)
• CHECK
Constrangerea UNIQUE
Aceasta desemneaza o coloana sau o combinatie de coloane ca o cheie uni- ca.Doua linii in
aceeasi tabela nu pot avea aceeasi valoare pentru aceasta cheie.NULL-urile sunt permise daca
cheia unica este bazata pe o singura co- loana.
Sintaxa constrangerii de tabela :
[CONSTRAINT nume constrangere] UNIQUE (Coloana, Coloana, ...)
Pentru a stabili relatia dintre EMP si DEPT astfel incat EMP.DEPTNO este cheia externa, si
fiecare angajat trebuie sa aiba un numar valid de departament care este cunoscut in DEPT:
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO)
REFERENCES DEPT(DEPTNO)
Table created.
Pentru a vedea descrierea lui DEPT30, introduceti:
DESC DEPT30
Table created.
DESC EMP_SALS;
SELECT *
FROM EMP_SALS;
Exercitii
Solutii
Fiecare din constrangerile aratate mai jos ar fi putut fi definite ca
orica-
re constrangere de tabela sau constrangere de coloana.
1.
CREATE TABLE PROJECTS
( PROJID NUMBER(4) CONSTRAINT PROJ_PRIM PRIMARY KEY,
P_DESC VARCHAR2(20),
P_START_DATE DATE,
P_END_DATE DATE,
BUDGET_AMOUNT NUMBER(7,2),
MAX_NO_STAFF NUMBER(2),
CONSTRAINT P_DATE_RULE CHECK(P_START_DATE <= P_END_DATE))
2.
CREATE TABLE ASSIGNMENTS
(PROJID NUMBER(4) NOT NULL REFERENCES PROJECTS
(PROJID),
EMPNO NUMBER(4) NOT NULL REFERENCES EMP (EMPNO),
A_START_DATE DATE,
A_END_DATE DATE,
BILL_RATE NUMBER(4,2),
ASSIGN_TYPE VARCHAR2(2))
Clauza MODIFY
DESCRIBE EMP;
Sunt 4 schimbari pe care nu le puteti face
1. Nu puteti schimba o coloana continand null-uri din NULL in NOT NULL.
2. Nu puteti adauga o noua coloana care este NOT NULL. Faceti-o null,
umpleti-o complet si apoi schimbati-o in NOT NULL. (de verificat!)
3. Nu puteti sa scadeti dimensiunea unei coloane sau sa-i schimbati tipul
de date, numai daca nu contine date. (de verificat!)
4. Nu puteti folosi optiunea MODIFY pentru a defini constrangeri pe o
coloana exceptand NULL/NOT NULL.
Pentru a modifica alte constrangeri trebuie sa le eliminati si apoi sa le a-
daugati specificand modificarile.
Clauza DROP
Folositi clauza DROP pentru a muta o constrangere din alta tabela.
Sintaxa:
ALTER TABLE nume tabela
DROP [CONSTRAINT nume constrangere ] [CASCADE]
[PRIMARY KEY ]
[UNIQUE (coloana, coloana, ...)]
De exemplu:
Pentru a vedea comentariul, selectati coloana COMMENTS din una din vederile
dictionarului:ALL_COL_COMMENTS sau USER_COL_COMMENTS. Dictionarul de Date
este acoperit mai tarziu in acest capitol.
Comanda RENAME
Cand se insereaza o valoare DATE, formatul DD-MON-YY este de obicei folosit. Data
deasemenea contine informatii de timp, care daca nu sunt specificate, implicit devin miezul
noptii (00:00:00).
Daca o data trebuie introdusa in alt secol si un timp specific este cerut deasemenea, folositi
functia TO_DATE:
INSERT INTO EMP
(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
VALUES (7658,
'MASON',
'ANALYST',
7566,
TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'),
3000,
NULL,
20);
1 record updated.
Daca clauza WHERE este omisa, toate liniile din tabela vor fi actualizate. Este posibil sa
folositi subcereri inlantuite si subcereri corelate in decla- ratia UPDATE.
Sa presupunem ca ati avut o cifra noua de comisioane pentru angajati siguri. De exemplu,
tabela COMMISSION de mai jos este folosita pentru a actualiza li- nii sigure ale tabelei EMP:
COMMISSION EMP
3 records updated.
Tabela COMMISSION poate contine mai mult decat o intrare pentru fiecare angajat, ca in
exemplul de mai jos :
COMISSION
EMPNO COMM
----- ----
7499 1100
7654 500
7654 100
7844 2000
7844 1500
Daca doriti sa inlocuiti (REPLACE) valorile din tabela EMP pentru comision cu comisionul
TOTAL pentru fiecare angajat listat in tabela COMISSION, atunci puteti utiliza urmatorul SQL
:
Exemplul 2:
UPDATE EMP
SET COMM = ( SELECT SUM(COMM) FROM COMISSION C
WHERE C.EMPNO = EMP.EMPNO)
WHERE EMPNO IN (SELECT EMPNO FROM COMISSION);
3 inregistrari modificate.
EMP
EMPNO COMM
----- ----
7499 1100
7654 600
7844 3500
O alta posibilitate este cea de a adauga (ADD) la valorile comisionului in tabela COMISSION
la comisioanele existente in tabela EMP mai mult decat inlocuirea lor. Exemplul 3 realizeaza
acest lucru :
Exemplul 3:
UPDATE EMP
SET COMM = ( SELECT SUM(COMM) + EMP.COMM
FROM COMISSION C
WHERE C.EMPNO = EMP.EMPNO)
WHERE EMPNO IN (SELECT EMPNO FROM COMISSION);
EMP
EMPNO COMM
----- ----
7844 3500
7499 1400
7654 2000
Pentru a sterge toate informatiile despre departamentul 10 din tabela EMP, introduceti :
DELETE FROM EMP
WHERE DEPTNO = 10;
Daca clauza WHERE este omisa, atunci toate liniile vor fi sterse.
IMAGINI (VIEWS)
Ce este o Imagine ?
• O imagine este ca o fereastra prin intermediul careia datele din tebele pot fi vizualizate
sau schimbate.
• O imagine este derivata dintr-o alta imagine sau tabela la care este referita ca tabela de
baza a imaginii - o tabela 'reala' cu date care sunt stocate fizic.
• O imagine este stocata doar ca o secventa SELECT. Este o tabela virtuala - adica este o
tabela care nu exista fizic, dar ii apare utilizatorului ca si cum ar exista.
• O imagine nu are date proprii. Ea manipuleaza datele din tabela de baza asociata.
Imaginile sunt utile pentru urmatoarele scopuri :
• Ingradirea accesului la o baza de date. Selectand dintr-o imagine (VIEW) putem afisa o
parte restransa din baza de date.
• Permite utilizatorilor sa faca cereri simple pentru obtinerea de rezultate din cereri
complicate. De exemplu, imaginile permit utili- zatorilor sa selecteze informatii din
tabele multiple fara cunoas- terea mecanismelor instructiunii JOIN.
• Furnizeaza independenta datelor pentru useri ad-hoc si programele aplicatiilor. O
imagine poate fi utilizata pentru a extrage trans- parent date din mai multe tebele. De
asemenea imaginile permit ca aceleasi date sa fie vazute de utilizatori diferiti in feluri
dife- rite.
Imagini Simple vs. Imagini Complexe
Clasificarea unei imagini simple :
• furnizeaza date dintr-o singura tabela
• nu contine functii sau grupuri (GROUP) de date.
O imagine complexa poate fi compusa din date care sunt :
• furnizate din mai multe tabele
• contine functii sau grupuri de date.
Comanda CREATE VIEW
CREATE [ OR REPLACE ] [FORCE] VIEW nume-view
[(coloana1, coloana2, ...)]
AS
SELECT secventa-select
[WITH CHECK OPTION [CONSTRAINT nume_constr]]
Coloana1, coloana2, etc. sunt numele date coloanelor in imaginesi trebiue sa corespunda
elementelor din lista selectata.
Pentru a crea o imagine simpla numita D10EMP, care contine unele detalii ale angajatilor din
Departamentul 10, introduceti :
CREATE VIEW D10EMP
AS
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE DEPTNO = 10;
Pentru a crea o imagine complexa numita DEPT_SUMMARY, care contine functii de grup si
date din doua tabele :
CREATE VIEW DEPT_SUMMARY
( NAME, MINSAL, MAXSAL, AVSAL )
AS
SELECT DNAME, MIN(SAL), MAX(SAL), AVG(SAL)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY DNAME;
De notat faptul ca numele coloanelor alternative au fost specificate pentru imagine. Aceasta
este o cerinta pentru cazul cand elementele SELECTate nu sunt conforme cu conventia
denumirilor din tabele / coloane, sau daca orice coloana din imagine este derivata dintr-o
functie sau expresie.
De notat si faptul ca daca o coloana este utilizata intr-o cerere (ANNSAL), o imagine a unui
alias al coloanei ( nume alternativ pentru coloana in imagine ) nu e necesar. De exemplu :
CREATE VIEW DEPT20
AS
SELECT ENAME, SAL*12 ANNSAL
FROM EMP
WHERE DEPTNO = 20;
O imagine nu poate contine clauza ORDER BY. Clauza ORDER BY este specificata cand se
executa SELECT din imagine.
Optiunea OR REPLACE
Aceasta optiune permite ca o imagine sa fie creata chiar daca exista una cu acelasi nume, astfel
inlociundu-se vechea varianta a imaginii pentru proprietarul ei. Aceasta inseamna ca o imagine
poate fi alterata fara a fi abandonata, recreandu-se si redand privilegiile obiectului.
Optiunea FORCE
Aceasta optiune creaza o imagine chiar daca tabela de baza nu exista, sau sunt prea putine
drepturi pentru tabela respectiva. Oricum, tabela trebiue sa existe inainte ca imaginea sa poata
fi utilizata.
Utilizarea unei Imagini cu Operatii DML
Imaginile sunt facilitati puternice deoarece ele ne permit sa executam verificari de integritate
referentiale asupra datelor modificate prin utilizarea imaginilor.
Clauza WITH CHECK OPTION specifica faptul ca INSERT si UPDATE executate pein
intermediul imaginii nu permit crearea de linii noi pe care imaginea nu le poate selecta, si de
aceea mermite constrangerile de integritate si vreificarile validarilor de date sa fie fortate
asupra datelor ce vor fi inserate sau actualizate.
In urmatorul exeplu, o imagine numita D10EMP este creata cu WITH CHECK OPTION.
Aceasta inseamna ca doar linii care au DEPTNO = 10 pot fi inserate, actualizate sau sterse.
Adica nici o secventa DML nu poate sa adreseze imaginea decat daca conditiile clauzei
imaginii sunt indepli- nite.
CREATE VIEW D10EMP
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMP
WHERE DEPTNO = 10
WITH CHECK OPTION;
Daca exista o incercare de a executa actiuni DML asupra liniilor pe care imaginea nu le poate
selecta intr-o clauza WHERE, se afiseaza eroare :
"ORA_01402 VIEW WITH CHECK OPTION
WHERE_Clause voilation."
Urmatorul exemplu va valida intratea oricarei comenzi INSERT/UPDATE astfel incat numarul
SAL sa fie intre 1000 si 2000, MGR va trebui sa aibe campul EMPNO valid, si DEPTNO sa
existe in tabela DEPT.
CREATE VIEW EMP_DATA
AS
SELECT EMPNO, ENAME, JOB, MGR, SAL, DEPTNO
FROM EMP
WHERE SAL BETWEEN 1000 AND 2000
AND MGR IN ( SELECT DISTINCT EMPNO
FROM EMP )
AND DEPTNO IN ( SELECT DEPTNO
FROM DEPT )
WITH CHECK OPTION;
Pentru a crea o imagine care sa restranga accesul la detaliile personale ale unui angajat valid in
tabela EMP, si timpul de acces la orele de servici, atunci introduceti urmatoarea comanda :
CREATE VIEW EMP_DETAILS
AS
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP
WHERE ENAME = USER
AND TO_CHAR(SYSDATE,'HH24') BETWEEN 9 AND 17
AND TO_CHAR(SYSDATE,'D') BETWEEN 2 AND 6
WITH CHECK OPTION;
Cand creati o imagine cu WITH CHECK OPTION, trebiue s-i atribuiti un nume restrictiei
WITH CHECK OPTION.
CREATE VIEW EMPLOYEES( ID_NUMBER, NAME, DEPARTMENT)
AS
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP
WHERE DEPTNO IN ( SELECT DISTINCT DEPTNO FROM DEPT)
WITH CHECK OPTION CONSTRAINT DEPT_CHECK;
Aceasta restrictie previne inserarea unei coloane in tabela EMP cu un numar care nu exista in
tabela DEPT.
Cand comanda CREATE VIEW este executata in seventa SELECT care urmeaza AS nu e
executata; in loc este doar depozitata in dictionarul de date.
Cand accesati date, via o imagine, ORACLE executa urmatoarele operatii :
• recupereaza definitia imaginii din dictionarul de date
• verifica drepturile de acces
• converteste cererea imaginii intr-o operatie echivalenta asupra tabelei sau tabelelor
asociate. Cu alte cuvinte, datele sunt recuperate din, sau o actualizare este facuta
asupra, tabelei(lor) de baza.
Odata ca imaginea a fost creata, trebuie sa se execute o cerere la Tabela Dictionarului de Date
numita USER_VIEWS ca sa se vada conanda view.
Acesti parametrii SETabili vor influienta afisarea imaginii text :
• Maxdata
• Arraysize
• Long
Imaginea text este memorata intr-o coloana de tipul de date Long si ar trebui setat
ARRAYSIZE la o valoare mica ( de ex. 1 ) pentru a vizualiza textul.
Modificarea Datelor prin Imagini
Dupa cum am discutat, restrictiile pot fi impuse cu ajutirul clauzei WITH CHECK OPTION
cand o imagine este creata. Mai sunt si alte constrangeri de care trebiue sa fiti atenti.
DELETE este interzis cand o imagine contine :
5. conditie Join
6. functii de grup
7. clauza GROUP BY
8. comanda DISTINCT
9. ROWNUM (nr de ordine al randului dupa ce acesta a fost adus din baza de date).
UPDATE este interzis cand :
4. Oricare de mai sus
5. Coloane definite prin expresii ( de ex. SAL*12 )
INSERT este interzis cand :
3. Oricare de mai sus
4. Orice NOT NULL coloane nu sunt selectate de imagine ( ex. EMPNO )
Comanda DROP VIEW
Utilizati comanda DROP pentru a sterge o imagine. Aceasta comanda elimina definitia imaginii
din baza de date. Coloanele si liniile nu sunt afectate deoarece sunt stocate in tabelele de unde a
derivat fiecare ima- gine. Imaginile sau alte aplicatii bazate pe o imagine stearsa devin in-
valide.
De notat ca o imagine poate fi derivata dintr-o tabela sau de fapt dintr-o alta imagine !
Sintaxa DROP este :
DROP VIEW nume_imagine;
Doar creatorul imaginii poate sa o stearga.
1. Definiti o imagine care sa produca urmatoarea iesire cand este referita intr-o cerere.
Rulati o cerere pentru a testa imaginea.
DEPTNO AVERAGE MAXIMUM MINIMUM SUM NO_SALS NO_COMMS
------ ---------- ------- ------- ----- -------- --------
10 2196.66667 5000 1300 8750 3 0
20 2175 3000 800 10875 5 0
30 1566.66667 2850 950 9400 6 4
2. Utilizand imaginea de mai sus, extrageti urmatoarea informatie. Nuarul angajatului
trebuie introdus la rulare.
EMPNO ENAME JOB SAL HIREDATE MINIMUM MAXIMUM
AVERAGE
----- --------- ------- ---- --------- ------- -------
-------
7902 FORD ANALYST 3000 05-DEC-83 800 3000
2175
3. Creati o imagine care sa impuna urmatoarele restrictii la insrearea datelor in tabela
ASSIGNMENTS.
1. Projid trebuie sa fie mai mic de 2000.
2. Data de sfarsit trebiue sa fie dupa data de inceput.
3. Tiputile valide pentru Assign_type sunt PF, WT sau ED.
4. Bill_rate trebuie sa fie mai mic decat 50.00 pentru Assign_type PF, mai mic de
60.00 pentru WT si mai mic de 70.00 pentru ED.
5. EMPNO trebuie sa fie valid.
6. Retineti clauza WITH CKECK OPTION.
SOLUTII
1.
CREATE VIEW AGGREGATES
( DEPTNO, AVERAGE, MAXIMUM, MINIMUM, SUM,
NO_SALS, NO_COMMS )
AS
SELECT DEPTNO,
AVG(SAL),
MAX(SAL),
MIN(SAL),
COUNT(SAL),
COUNT(COMM),
FROM EMP
GROUP BY DEPTNO;
2.
SELECT EMP.DEPTNO,
ENAME,
JOB,
SAL,
HIREDATE,
MINIMUM,
MAXIMUM,
AVERAGE
FROM EMP, AGGREGATES AGG
WHERE EMP.DEPTNO = AGG.DEPTNO
AND EMP.EMPNO = & EMPNO;
3.
CREATE VIEW ASG_VAL
AS
SELECT PROJID,
EMPNO,
A_START_DATE,
A_END_DATE,
BILL_RATE,
ASSIGN_TYPE,
HOURS,
FROM ASSIGNMENTS
WHERE A_START_DATE < A_END_DATE
AND PROJID < 2000
AND BILL_RATE <= DECODE(
ASSIGN_TYPE,'PF',50,'WT',60,70)
AND EMPNO IN
( SELECT EMPNO FROM EMP )
WITH CHECK OPTION;
Procedurile stocate
Dezvoltarea aplicatiilor de baze de date presupune gasirea de solutii care sa permita constructia
eficienta si posibilitatea de modificare a procedurilor care realizeaza operatiunile asupra
informatiei incluse in bazele de date. Procedurile stocate pe serverul de baze de date sunt
solutia principala pentru crearea unor aplicatii performante, constituind in acelasi timp
modalitatea cea mai eficienta de implementare a operatiunilor asupra bazelor de date in
sistemele client/server.
Exemplu 1:
Dorim sa creem o procedura stocata care sa stearga un anumit articol din tabela repere:
CREATE OR REPLACE PROCEDURE stergrepere
(codrep IN NUMBER) IS
BEGIN
Delete From repere Where cod = codrep;
End stergrepere;
Exemplu 2:
Dorim sa creem o procedura care sa insereze un anumit numar de articole in aceasta tabela:
Putem folosi declaratia EXECUTE pentru a rula o procedura stocata. Procedurile stocate sunt
diferite de functii deoarece nu pot returna valori in locul numelui lor si nu pot fi folosite direct
intr-o expresie.
Modificati acesta procedura in sensul inserarii unui anumit numar de articole incepand cu un
cod initial.
Exemplul 3:
In continuare dorim sa actualizam campul explicatii cu valoarea ‘nou’ la toate articolele cu un
cod mai mare decat o valoare data:
Exemplul 4:
PROCEDURE acordare_bonus (sel_marca NUMBER) IS
bonus REAL;
eroare EXCEPTION;
BEGIN
SELECT sal * 0.15 INTO bonus FROM emp WHERE marca = sel_marca;
IF bonus IS NULL THEN
RAISE eroare;
ELSE
UPDATE plati SET plati = plati + bonus WHERE marca = sel_marca;
END IF;
EXCEPTION
WHEN eroare THEN
dbms_output.put_line('marca inexistenta in baza de date’);
END acordare_bonus;
Procedura acordare_bonus primeste ca argument la rulare marca salariatului pentru care se
aplica bonificatia. Daca in urma rularii instructiunii Select nu este selectata nici o inregistrare
din baza de date, executia codului va fi transmisa in sectiunea exceptiilor, afisandu-se un mesaj
de eroare. In caz contrar se aplica instructiunea Update asupra tabelei Plati.
Concluzii:
Procedurile stocate constituie incontestabil, o cale pentru eficientizarea operatiunilor realizate
asupra bazelor de date. Acest lucru se impune din cel putin doua elemente esentiale: primul
consta in forma compilata a acestora, fapt ce determina rularea mai rapida; iar cel de-al doilea
priveste elementele de programare in cazul aplicatiilor de baze de date, procedurile stocate
determinand in acest sens o integrare mai fireasca a elementelor de limbaj SQL.
Declansatorii (Triggeri)
Declansatorii (Triggers) sunt un tip special de proceduri stocate care permit realizarea automata
a unor actiuni (proceduri SQL) atunci cand datele sunt modificate prin intermediul unuia dintre
operatorii standardului SQL: Update, Insert sau Delete. Declansatorii pot fi utilizati pentru
constructia unor reguli complexe la nivelul bazei de date sau pentru pastrarea integritatii
referentiale a acesteia. Printre avantajele utilizarii declansatorilor mentionam:
- Declansatorii opereaza automat, imediat dupa ce au fost realizate modificarile asupra bazei de
date.
- Prin intermediul acestui instrument exista posibilitatea de a efectua modificari in cascada
asupra mai multor tabele ale bazei de date.
- Declansatorii permit constructia unor reguli stricte la nivelul bazei de date utilizand
facilitatile oferite de limbajul SQL.
Un element important care este necesar sa-l subliniem in legatura cu declansatorii il constituie
faptul ca acestia nu pot fi aplicati decat la nivelul tabelelor bazei de date.
Cand o instructiune SQL satisface conditia triggerului, Oracle automat executa corpul
triggerului.
Sintaxa este urmatoarea:
referencing_clause:
FOR EACH ROW
REFERENCING OLD [AS] old [FOR EACH ROW]
REFERENCING NEW [AS] new [FOR EACH ROW]
REFERENCING PARENT [AS] parent [FOR EACH ROW]
CREATE [OR REPLACE] TRIGGER name { BEFORE | AFTER } { event [OR ...] }
ON table FOR EACH { ROW | STATEMENT }
EXECUTE PROCEDURE func ( arguments )
Exemplul 1:
Pentru a crea un trigger care pentru fiecare client sters din tabela Customer creaza un articol in tabela
CustomerHistory se procedeaza astfel:
CREATE OR REPLACE TRIGGER DeleteCustomer
BEFORE DELETE ON Customer
FOR EACH ROW
BEGIN
INSERT INTO CustomerHistory
VALUES(:Old.CUSTOMERID, :Old.LastName, :Old.FirstName);
END DeleteCustomer;
Observatii:
Daca printr-o instructiune SQL se sterg mai multi clienti, triggerul actioneaza la fiecare client
sters.
In corpul triggerului new si old trebuie precedate de “:”.
Exemplul 2: Dorim sa inseram clienti in tabela Customer folosind un trigger si o secventa care
sa genereze automat codul clientului (customerid):
create sequence secventa_customer
start with 1
increment by 1
nomaxvalue;
Daca in tabela de clienti avem deja 120 de intrari (cu customerid 1-120) putem porni secventa
folosind:
start with 121
Daca dorim ca numerele de clienti sa fie din 2 in 2 folosim:
increment by 2
Acum se poate crea triggerul ce va insera automat urmatorul numar din secventa in coloana customerid:
create trigger customer_trigger
before insert on customer
for each row
begin
select secventa_customer.nextval into :new.customerid from dual;
end;
/
Modificarea unui trigger (in sensul dezactivarii sau a reactivarii) se face astfel:
alter trigger nume_trigger disable;
alter trigger nume_trigger enable;
Functii
O clasa speciala de proceduri stocata este formata din functiile prin intermediul carora poate fi
returnata o valoare. O functie stocata prezinta in plus fata de o procedura o clauza speciala
Return, prin intermediul careia se realizeaza aceasta operatiune. Iata cum cream o functie
simpla:
PL/SQL
Exemple:
DECLARE
cantitate_in_stoc NUMBER(5);
BEGIN
SELECT quantity INTO cantitate_ in_stoc FROM stocuri
WHERE product = 'MINGI DE TENIS’
FOR UPDATE OF quantity;
IF cantitate_in_stoc > 0 THEN
UPDATE stocuri SET quantity = quantity - 1
WHERE product = 'MINGI DE TENIS’;
INSERT INTO achizitii_record
VALUES ('Mingi de tenis achizitionate’, SYSDATE);
ELSE
INSERT INTO purchase_record
VALUES ('Stocul epuizat’, SYSDATE);
END IF;
COMMIT;
END;
Procedura defineste o variabila (cantitate_in_stoc) care va prelua din baza de date stocul
disponibil pentru un articol de stoc, urmand ca prin intermediul instructiunii IF sa se realizeze
fie diminuarea stocului, fie includerea in tabela purchase_record a unui mesaj de avertizare
privind epuizarea stocului.
Concluzii: PL/SQL este limbajul care permite manipularea eficienta a elementelor bazei de
date. Adaugarea elementelor procedurale alaturi de limbajul SQL constituie "cheia" care
permite constructia unor proceduri complexe de prelucrare a bazei de date. Constructia
procedurilor si functiilor stocate la nivelul bazei de date prezinta alaturi de viteza mare de
executie (consecinta compilarii acestora), avantajul gestionarii unitare prin intermediul unor
utilitare tip Schema Manager. Aceste instrumente constituie o modalitate de constructie,
vizualizare sau modificare a ansamblului de elemente si obiecte ce compune baza de date
Oracle.