0% au considerat acest document util (0 voturi)
9 vizualizări86 pagini

F PDF

Experimentul 1 se concentrează pe introducerea în SQL, crearea tabelelor Client Master și Product Master, precum și inserarea datelor în acestea. De asemenea, documentul include interogări pentru a extrage informații relevante din tabelele create. Teoria SQL este explicată, incluzând concepte precum DDL, DML, integritate și autorizare.

Tradus de

ScribdTranslations
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
9 vizualizări86 pagini

F PDF

Experimentul 1 se concentrează pe introducerea în SQL, crearea tabelelor Client Master și Product Master, precum și inserarea datelor în acestea. De asemenea, documentul include interogări pentru a extrage informații relevante din tabelele create. Teoria SQL este explicată, incluzând concepte precum DDL, DML, integritate și autorizare.

Tradus de

ScribdTranslations
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

Experimentul 1

Data:

Obiectiv:
Introducere în SQL. De asemenea, proiectaț i tabele SQL pentru baza de date Client Master ș i Product Master.
ș i afiș aț i toate valorile.

Software Used:
Oracle 12c ș i DataGrip IDE

[Link]ț i următoarele tabele:

i) Client_master
columnname tip de date dimensiune
client_no varchar2 6
name varchar2 20
address1 varchar2 30
address2 varchar2 30
oraș varchar2 15
stat varchar2 15
pincode number 6
bal_due număr 10,2

ii) Product_master
Columnname tip de date size
Product_no varchar2
Description varchar2
Profit_percent număr
Unit_measure varchar2
Qty_on_hand număr
Numărul Reoder_lvl
Sell_price număr
Numărul de preț de cost

Q2. Introduceț i următoarele date în tabelele corespunzătoare:

Client_no Name oraș cod poș tal stat balanț a

0001 Ivan Bombay 400054 Maharashtra 15000


0002 Vandana Madras 780001 Tamil Nadu 0
0003 Pramada Bombay 400057 Maharashtra 5000
0004 Basu Bombay 400056 Maharashtra 0
0005 Ravi Delhi 100001 2000
0006 Rukmini Bombay 400050 Maharashtra 0
Date pentru Masterul Produsului:

Product No. Description Profit % Unit Qty Recomandare


Vinde Cost
Procent măsurat la nivelul mâinii price price

P00001 1.44 dischete 5 buchet 100 20 525 500


P03453 Monitoare 6 bucată 10 3 12000 11200
P06734 Ș oarece 5 bucluc 20 5 1050 500
P07865 1.22 dischete 5 buclă 100 20 525 500
P07868 Tastaturi 2 bucată 10 3 3150 3050
P07885 Unitate CD 2.5 bucată 10 3 5250 5100
P07965 540 HDD 4 bucată 10 3 8400 8000
P07975 1.44 Conducere 5 bucată 10 3 1050 1000
P08865 1.22 Drive 5 piece 2 3 1050 1000

Q3:- Pe baza celor două tabele de mai sus, răspundeț i la următoarele chestionare:

i) Găsi ț i numele tuturor clien ț ilor.


ii) Recupera ț i lista de nume ș i ora ș e ale tuturor clien ț ilor.
iii) Lista ț i diferitele produse disponibile din tabelul product_master.
iv) Lista ț i to ț i clien ț ii care se află în Bombay.
v) Afi ș aț i informa ț iile pentru clientul nr. 0001 ș i 0002.
vi) Găsi ț i produsele cu descrierea ‘ 1.44 drive ’ ș i ‘ 1.22 Drive ’.
vii) Găsi ț i toate produsele al căror pre ț de vânzare este mai mare de 5000.
viii)Find the list of all clients who stay in in city ‘Bombay’ or city ‘Delhi’ or ‘Madras’.
ix) Găsi ț i produsul al cărui pre ț de vânzare este mai mare de 2000 ș i mai mic sau egal cu 5000.
x) Lista ț i numele, ora ș ul ș i statul clien ț ilor care nu se află în statul 'Maharashtra'.

Teorie ș i concepte:

Introducere despre SQL


SQL (Limbaj de Interogare Structurat) este un limbaj non-procedural, specifici ce vrei, nu cum.
pentru a-l obț ine. Un format structurat pe blocuri al cuvintelor cheie în engleză este utilizat în acest limbaj de interogare. Are
următoarele componente.

DDL (Limbaj de Definire a Datelor)


DDL SQL oferă comenzi pentru definirea schemelor de relaț ie, ș tergerea relaț iilor ș i modificarea
schema de relaț ie.

DML (Limbaj de Manipulare a Datelor)


Include comenzi pentru a insera tupluri în, a ș terge tupluri din ș i a modifica tupluri în baza de date.

Definiț ia vizualizării
DDL-ul SQL include comenzi pentru definirea vizualizărilor.
Controlul tranzacț iilor - SQL include specificarea începutului ș i sfârș itului tranzacț iilor.
SQL încorporat ș i SQL dinamic
SQL încorporat ș i dinamic definesc modul în care declaraț iile SQL pot fi încorporate într-un scop general.
limbajele de programare, precum C, C++, JAVA, COBOL, Pascal ș i Fortran.

Integritate
DDL-ul SQL include comenzi pentru specificarea constrângerilor de integritate pe care datele stocate în
baza de date trebuie să specifice. Actualizările care încalcă constrângerile de integritate sunt permise.

Authorization-
DDL-ul SQL include comenzi pentru specificarea drepturilor de acces la relaț ii ș i vizualizări.

Limbajul de Definiț ie a Datelor

DDL-ul SQL permite specificarea nu doar a unui set de relaț ii, ci ș i informaț ii despre fiecare.
relaț ie, inclusiv-
Schema pentru fiecare relaț ie
Domeniul valorilor asociat fiecărui atribut.
Condiț iile de integritate.
Setul de indici care trebuie menț inut pentru fiecare relaț ie.
Informaț iile de securitate ș i autorizare pentru fiecare relaț ie.
Structura fizică de stocare a fiecărei relaț ii pe disc.

Tipuri de domenii în SQL

Standardul SQL suportă o varietate de tipuri de domenii încorporate, inclusiv-


Char (n) - Un ș ir de caractere de lungime fixă, cu o lungime specificată de utilizator.
Varchar (n) - Un ș ir de caractere cu lungime variabilă, cu o lungime maximă specificată de utilizator, n.
Int - Un număr întreg.
Număr întreg mic - Un număr întreg mic.
Numeric (p, d) - Un număr zecimal cu punct fix cu precizie definită de utilizator.
Numere în virgulă mobilă de precizie reală ș i dublă, precum ș i numere în virgulă mobilă de precizie dublă cu
precizia dependentă de maș ină.
Float (n) - Un număr cu virgulă mobilă, cu o precizie de cel puț in n cifre.
Data - O dată calendaristică care conț ine un an (format de patru cifre), lună ș i zi a lunii.
Timp - timpul din zi, în ore, minute ș i secunde, de exemplu: Timp ’09:30:00’.
Number- Number is used to store numbers (fixed or floating point).

Declaraț ie DDL pentru crearea unei tabele-

Sintaxă
Creează tabelul nume_tabel
(numele_colului tip_date(dimensiune), numele_colului tip_date(dimensiune));
Crearea unei mese dintr-o masă

Sintaxă
CREAȚ I TABELUL NUME_TABEL
[(nume_columnă, nume_columnă, ………)]
AS SELECT columnname, columnname……..FROM tablename;
Inserarea datelor în tabele-

Sintaxă-
INSERARE ÎN tablename
[(numele coloanei, numele coloanei, ………)]
Valori(exprimaț ie, exprimaț ie);

Inserarea datelor într-un tabel dintr-un alt tabel:

Sintaxă-
INSERARE ÎN nume_tabel
SELECT nume_column, nume_column, …….
DIN numele_tabelei;

Inserarea datelor selectate într-un tabel dintr-un alt tabel:

Sintaxă
INSERARE ÎN tabela
SELECT numelecolonnei, numelecolonnei……..
DE la numele_tabelei
WHERE columnname= expression;

Recuperarea datelor din tabele-

Sintaxă
SELECT * DE LA numele_tabelului;

Recuperarea coloanelor specifice dintr-un tabel

Sintaxă
SELECT numele_coloanei, numele_coloanei, …
DIN numele_tabelei;

Eliminarea duplicatelor din instrucț iunea select

Sintaxă
SELECT DISTINCT nume_coloană, nume_coloană
DIN numele_tabelului;

Selectarea unui set de date din tabel


Sintaxă-
SELECT numele_colonei, numele_colonei
DIN nume_tabel
UNDE condiț ia_de_căutare;

Output:

Răspuns 1. Crearea tabelelor i. client_master ș i ii. product_master.

Interogare:

i. creați tabelă client_master (client_no varchar2(6), nume varchar2(30),


address1 varchar2(30), address2 varchar2(30), city varchar2(15),
state varchar2(15), pincode number(6), bal_due number(10,2));

ii. creați tabelul product_master (product_no varchar2(50), descriere varchar2(30), procent_profit


număr(10,2), unitate_măsură varchar2(30), cantitate_pe_stoc număr(15), nivel_recomandat număr număr(15)
sell_price number(38,2), cost_price number(38,2));

Result:

i. ii.

Ans [Link] values in i. client_master and ii. product_master.

Interogare:

i. inserează în client_master (client_no, nume, oraș, cod poștal, stat, sold_de_plată) valori
('0001','Ivan','Bombay','400054','Maharashtra','15000');
insera în client_master (client_no, nume, oraș, cod_posta, stat, bal_due) valori
('0002','Vandana','Madras','780001','Tamilnadu','0');
inserare în client_master (client_no,nume,oraș,cod_postal,stat,suma_de_plată) valori
('0003','pramada','Bombay','400057','Maharashtra','5000');
inserați în client_master (client_no, nume, oraș, cod poștal, stat, sold_datorat) valori
('0004','Basu','Bombay','400056','Maharashtra','0');
inserați în client_master (client_no,nume,oraș,cod_posta,suma_due) valori ('0005','Ravi','Delhi','100001','2000');
inserează în client_master (client_no,nume,oraș,cod poștal,stat,balanț datorat) valori
('0006','Rukmani','Bombay','400050','Maharashtra','0');

ii. inserați în product_master (număr_produs, descriere, procent_profit, unitate_măsură,


qty_on_hand,reorder_lvlnumber,sell_price,cost_price) values
('p00001','1.44floppies','5','peice','100','20','525','500');
inserați în product_master (număr_produs, descriere, procent_profit, unitate_măsură,
qty_on_hand,reorder_lvlnumber,sell_price,cost_price) values ('p00001','Monitors',
'6','peice','10','3','12000','11200');
inserați în product_master (număr_produs, descriere, procent_profit, unitate_măsură,
qty_on_hand,reorder_lvlnumber,sell_price,cost_price) values ('p00001','Mouse','5','peice','20','5','1050','500');
inserați în product_master (număr_produs, descriere, procent_profit, unitate_măsură,
qty_on_hand,reorder_lvlnumber,sell_price,cost_price) values
('p00001','1.22floppies','5','peice','100','20','525','500');
introduceți în product_master (număr_produs, descriere, procent_profit, unitate_măsură,
qty_on_hand,reorder_lvlnumber,sell_price,cost_price)
values ('p00001','Keyboard','2','peice','10','3','3150','3050');
inserați în product_master (număr_produs, descriere, procent_profit, unitate_măsură,
qty_on_hand,reorder_lvlnumber,sell_price,cost_price)
values ('p00001','CD_drive','2.5','peice','10','3','5250','5100');
inserează în product_master (număr_produs, descriere, procent_profit, unitate_măsură,
qty_on_hand,reorder_lvlnumber,sell_price,cost_price)
valori ('p00001','540 HDD','4','bucată','10','3','8400','8000');
inserați în product_master (număr_produs, descriere, procent_profit, unitate_măsură,
qty_on_hand,reorder_lvlnumber,sell_price,cost_price)
valori ('p00001','1.44Drive','5','bucată','10','3','1050','1000');
inserează în product_master (product_no, descriere, procent_profit, unitate_măsură,
qty_on_hand,reorder_lvlnumber,sell_price,cost_price)
valori ('p00001','1.22Drive','5','bucată','2','3','1050','1000');

Result:

i. client_master

ii. master_produs
Răspuns 3.

i. Aflaț i numele tuturor clienț ilor.

Interogare:selectați numele din client_master;

Result:

ii. Retrieve the list of names and cities of all the clients.

Interogare:selectați nume, oraș din client_master;

Result:

iii. Listaț i diferitele produse disponibile din tabela product_master.

Query:select description from product_master;

Result:
iv. Listaț i toț i clienț ii care se află în Bombay.

Interogare:select name from client_master where city='Bombay';

Result:

v. Afiș aț i informaț iile pentru clientul nr. 0001 ș i 0002.

Query:select * from client_master where client_no='0001' sau client_no='0002';

Result:

Găsiț i produsele cu descrierea '1.44 drive' ș i '1.22 Drive'.

Interogare:select * from produs_master where descriere='1.44Drive' or descriere='1.22Drive';

Result:

vii. Găse ș te toate produsele al căror pre ț de vânzare este mai mare de 5000.

Interogare:select * from product_master where sell_price > '5000';

Result:
viii.Găsiț i lista tuturor clienț ilor care stau în oraș ul 'Bombay' sau oraș ul 'Delhi' sau 'Madras'.

Interogare:select * from client_master where city='Bombay' or city='Madras' or city='Delhi';

Result:

ix. Găsi ț i produsul a cărui pre ț de vânzare este mai mare de 2000 ș i mai mic sau egal cu 5000.

Query:select * from product_master where sell_price >2000 and sell_price <= 5000;

Result:

[Link] ț i numele, ora ș ul ș i statul clien ț ilor care nu se află în statul 'Maharashtra'.

Interogare:select name,city,state from client_master where state !='Maharashtra' or state is null;

Result:
Experimentul 2

Date:

Obiectiv:
Create the SQL queries for commands like update, alter, rename, delete and drop.

Software utilizat:
Oracle 12c ș i DataGrip IDE

Q1 Folosind tabela client master ș i tabela produs master, răspundeț i la următoarele întrebări.

i. Schimba ț i pre ț ul de vânzare al unită ț ii floppy de 1.44 la 1150,00 RON


ii. Ș tergeț i înregistrarea cu clientul 0001 din tabela principală a clien ț ilor.
iii. Schimbă ora ș ul clientului cu numărul '0005' în Bombay.
iv. Schimbă bal_due al clientului cu numărul ‘ 0001’ la 1000.
v. Găsi ț i produsele al căror pre ț de vânzare este mai mare de 1500 ș i găsi ț i, de asemenea, noul pre ț de vânzare ca
preț ul de vânzare original *15.
vi. Găsi ț i clien ț ii care locuiesc într-un ora ș al cărui al doilea litera este a.
vii. Afla ț i numele tuturor clien ț ilor care au ‘ a’ ca a doua literă în numele lor.
viii. Lista ț i produsele în ordine sortată după descrierea lor.
ix. Numără totalul comenzilor
x. Calculează preț ul mediu al tuturor produselor.
xi. Calculaț i preț ul minim al produselor.
[Link] the maximum and minimum prices . Rename the tittle as ‘ max_price’ and
preț _minim respectiv.
xiii. Număra ț i numărul de produse cu pre ț mai mare sau egal cu 1500.

Teorie ș i concepte:

DML (Limbaj de manipulare a datelor) Manipularea datelor este

Recuperarea informaț iilor stocate în baza de date.


Inserarea de informaț ii noi în baza de date.
Ș tergerea informaț iilor din baza de date.
Modificarea informaț iilor stocate de modelul de date adecvat. Există practic două
tipuri.
(i) DML procedural:- necesită ca un utilizator să specifice ce date sunt necesare ș i cum să obț ină aceste date.
date.
(ii) DML non-procedural: require un utilizator să specifice ce date sunt necesare fără a specifica
cum să obț ii acele date.

Actualizarea conț inutului unei tabele:


În situaț ia de creaț ie, s-ar putea să dorim să schimbăm o valoare în tabel fără a schimba toate valorile din tuplu.
În acest scop, se poate folosi declaraț ia de actualizare.

Actualizaț i numele tabelului


Setaț i numele coloanei = expresie, numele coloanei = expresie……
Unde columnname = expresie;

Operaț iunea de ș tergere:-


O cerere de ș tergere este exprimată în mod similar cu interogarea. Putem ș terge un întreg tuplu.
(linii) putem ș terge valori doar pe anumite atribute.

Ș tergerea tuturor rândurilor

Sintaxă:
Ș terge din numele tabelei :

Ș tergerea unui număr specificat de rânduri


Sintaxă:

Ș terge din tabela nume


Unde condiț ia de căutare ;

Computaț ie în listele de expresii folosite pentru a selecta date

+ Adunare Scădere
* înmulț ire exponenț iere
/ Divizare Operaț iune închisă

Renaming columns used with Expression Lists: - Numele coloanelor de ieș ire implicite pot fi redenumite
de către utilizator, dacă este necesar

Sintaxă:

Selectaț i numele coloanei result_columnname,


Columnname result_columnname,
Din numele tabelului;

Logical Operators:
Operatorii logici care pot fi utilizaț i în sentinț ele SQL sunt
ȘI toate trebuie să fie incluse
SAU orice poate fi inclus
NU niciunul dintre ele nu ar putea fi inclus

Căutarea în interval:Operaț iunea între este utilizată pentru căutarea în interval.

Pattern Searching:
Cea mai frecvent utilizată operaț ie pe ș iruri este potrivirea modelului folosind operaț ia 'like' pe care o
descrie modele folosind două caractere speciale.

Procent (%) ; caracterul % se potriveș te cu orice subș ir, luând în considerare următoarele exemple.
„Perry %” se potriveș te cu orice ș ir care începe cu perry
% idge % se potriveș te cu orice ș ir care conț ine 'idge' ca subș ir.
'- - -' se potriveș te cu orice ș ir exact de trei caractere.
‘- - - % matches any string of at least of three characters.

Funcț ii Oracle:
Funcț iile sunt folosite pentru a manipula elemente de date ș i a returna rezultate. Funcț ia urmează formatul funcț iei
_name (argument1, argument2 ..) .An arrangement is user defined variable or constant. The structure
a funcț iei este astfel încât acceptă zero sau mai multe argumente.
Exemple:
Medie returnaț i valoarea medie a n

Sintaxă:
Medie ([distinct/tot]n)
Min returnează valoarea minimă a expresiei.

Sintaxă:
MIN((distict/all )expr)
Numără Returnează numărul de rânduri în care expr nu este nul
Sintaxă:
Număraț i ([distinct/tot] expr)
Numără (*) Returnează numărul de rânduri din tabel, inclusiv duplicatele ș i cele cu valori nule.
Max Returnează valoarea maximă a expresiei

Sintaxă:

Max ([distinct/all]expr)
Sum Întoarce suma valorilor lui n

Sintaxă:
Suma ([distinct/toate]n)
Sortarea datelor în tabel

Sintaxă:
Selectaț i numele coloanei, numele coloanei
Din tabel
Ordonaț i după numele coloanei;

Output:

i. Schimba ț i pre ț ul de vânzare al unită ț ii de dischetă de 1,44 la 1150,00 RON.

Interogare:update product_master set sell_price=1150.00 where description='1.44floppies';

Result:

ii. Schimba oraș ul clientului_no '0005' în Bombay.

Query:actualizează client_master set oraș='Bombay' unde client_no='0005';

Result:

iii. Schimbaț i bal_due al clientului cu numărul '0001' la 1000.

Interogare:update client_master set bal_due=1000 where client_no='0001';

Result:

iv. Găsi ț i produsele a căror pre ț de vânzare este mai mare de 1500 ș i găsi ț i de asemenea noul
preț de vânzare ca preț de vânzare original * 15.
Întrebare:selectați descrierea din product_master unde prețul de vânzare este mai mare de 1500;
actualizează produs_master setare preț_vânzare=preț_vânzare*15;
selectați prețul_de_vânzare din produs_master;

Result:

v. Găsiț i clienț ii care locuiesc într-un oraș al cărui al doilea litera este a.

Interogare:select*from CLIENT_MASTER unde oraș like '_a%';

Result:

vi. Găsiț i numele tuturor clienț ilor care au 'a' ca a doua literă în numele lor.

Întrebare:selectnamefrom CLIENT_MASTER where name like '_a%';

Rezultat:

vii. Lista ț i produsele în ordinea sortată a descrierii lor.

Interogare:select * from product_master order by description asc;

Result:
viii. Numără numărul total de comenzi

Întrebare:select sum (reorder_lvlnumber) from product_master;

Result:

ix. Calculaț i preț ul mediu al tuturor produselor.

Interogare:select avg (cost_price) from product_master;

Result:

x. Calculează preț ul minim al produselor.

Interogare:select min (cost_price) din product_master;

Result:

[Link] the maximum and minimum prices . Rename the tittle as ‘max_price’ and
preț _minim respectiv.

întrebare selectează min (cost_price) ca min_price,


max (preț_cumpărare) ca max_pret din product_master;

Result:

xii. Numără produsele care au un pre ț mai mare sau egal cu 1500.

Întrebare:select count (cost_price) from product_master where cost_price >= 1500;

Result:
xiii. Delete the record with client 0001 from the client master table.

Întrebare:şterge * din client_master unde client_no='0001';

Result:
Experimentul 3
Date:

Obiectiv:
Pentru a implementa restricț iile pe tabel.

Software Used:
Oracle 12c ș i DataGrip IDE

Întrebare1: Creaț i următoarele tabele:

i. Sales_master

Columnname Tip de date Size Attributes


Salesman_no varchar2 6 Cheie primară/litera întâi
trebuie să înceapă cu 's'
Sal_name varchar2 20 Nu nul
Adresă varchar2 Nu nul
Oraș varchar2 20
Stat varchar2 20
Pincode Număr 6
Sal_amt Număr 8,2 Nu null, nu poate fi 0
Tgt_de_obț inut Număr 6,2 Nu null, nu poate fi 0
Ytd_sales Număr 6,2 Nu nul, nu poate fi 0
Observaț ii Varchar2 30

ii. Sales_order

Columnname Tip de date Size Atribute


S_order_no varchar2 6 Litera primară/primul trebuie să fie 0
S_order_date Date 6 Referinț ă cheie primară clientno
al tabelului client_master
Client_no Varchar2 25
Dely_adă Varchar2 6
Salesman_no Varchar2 6 Referinț e cheie străine
salesman_no of
tabel_vânzător_master
Dely_type Caracter 1 Partea de livrare(p)/completa(f), implicit f
Billed_yn Caracter 1
Dely_date Date Nu poate fi mai mic decât
s_order_date
Order_status Varchar2 10 Valori (‘in
process’;’fulfilled’;back
order’;’canceled

iii. Sales_order_details

Coloană Tip de date Dimensiune Atribute

S_order_no Varchar2 6 Cheia primară/foreign


referinț e cheie
s_order_no of
sales_order
Product_no Varchar2 6 Cheia primară/străină
referinț e cheie
numărul_produsului
master_produs
Qty_order Numărul 8
Qty_disp Număr 8
Product_rate Număr 10,2

Introduceț i următoarele date în tabelele lor respective folosind instrucț iunea insert:

i. Date pentru tabelul master al vânzătorilor


Salesma Salesman Addre City Pin Stat Sala Tgt_to_g Ytd Remar
n_no name ss cod mt et Sales k
500001 Kiran A/14 Bo 40000 mAh 3000 100 50 Bine
worli mb 2
ay
500002 Manish 65,nari Bo 40000 Mah 3000 200 100 Bine
bărbat mb 1
ay
500003 Ravi P-7 Bo 40003 Mah 3000 200 100 Bun
Bandr mb 2
a da
500004 Ashish A/5 Bo 40004 Mah 3500 200 150 Bun
Juhu mb 4
ay

ii. Date pentru tabela comenzilor de vânzare:

S_orderno S_orderdate Client no Dely FacturăSalesman Întârziere Order


tip yn nu data status
019001 12-ian-96 0001 F N 50001 20-ian- Ip
96
019002 25-ian-96 0002 P N 50002 27-ian- C
96
016865 18-feb-96 0003 F Y 500003 20-feb- F
96
019003 03-apr-96 0001 F Y 500001 07-apr- F
96
046866 20-may-96 0004 P N 500002 22- C
mai-96
010008 24-may-96 0005 F N 500004 26- Ip
mai-96

iii. Date pentru tabelul sales_order_details:

S_order no Număr produs Qty ordered Qty disp Product_rate


019001 P00001 4 4 525
019001 P07965 2 1 8400
019001 P07885 2 1 5250
019002 P00001 10 0 525
046865 P07868 3 3 3150
046865 P07885 10 10 5250
019003 P00001 4 4 1050
019003 P03453 2 2 1050
046866 P06734 1 1 12000
046866 P07965 1 0 8400
010008 P07975 1 0 1050
010008 P00001 10 5 525

Teorie ș i concepte:
Constrângerile datelor: În afară de numele celulei, lungimea celulei ș i tipul de date al celulei, există ș i altele
parametrii, adică alte constrângeri de date care pot fi transmise DBA-ului la momentul creării verificării.
Contraintele pot fi plasate fie la nivel de coloană, fie la nivel de tabel.

i. Constrângeri la nivel de coloană: Dacă constrângerile sunt definite împreună cu coloana


definiț ie, se numeș te constrângere la nivel de coloană.
ii. Constrângeri la nivel de tabel: Dacă constrângerea de date ata ș ată unei celule specifice dintr-un tabel
reference the contents of another cell in the table then the user will have to use table
restricț ii de nivel.

Conceptul valorii nule:-în timp ce se creează tabele, dacă o linie blochează o valoare de date pentru un anumit
coloana care valoarea este spusă că este null. Coloana de orice tip de date poate conț ine valori null
cu excepț ia cazului în care coloana a fost definită ca ne-null atunci când tabelul a fost creat

Sintaxă:
Creează tabelul numetabel
(nume_coloană tip_date (dimensiune) nu_null ……)
Cheia primară: cheia primară este una sau mai multe coloane într-un tabel folosite pentru a identifica unic
fiecare rând în tabel. Valorile cheii primare nu trebuie să fie nule ș i trebuie să fie uni.
o multicolumnă. O cheie primară multicolumnă se numeș te cheie primară compusă.

Sintaxă: cheie primară ca o constrângere de coloană


Creează tabelul tablename
(numele coloanei tip de date (dimensiune) cheie primară,….)
Cheie primară ca o constrângere de tabel
Creează tabelul numetabel
(numele coloanei tip de date (dimensiune), numele coloanei tip de date (dimensiune)…

Cheie primară (nume_coloană,nume_coloană));

Conceptul cheie al UniQuestion:-Un uniQuestion este similar cu o cheie primară, cu excepț ia faptului că
scopul unei chei uniQuestion este de a asigura că informaț iile din coloana pentru fiecare
înregistrarea este uniQuestion, la fel ca numerele de licenț ă pentru telefoane sau dispozitive. O masă poate avea
multe chei uniQuestion.

Sintaxă: UniQuestion ca o constrângere de coloană.


Creează tabel nume
(numele coloanei tip de date (mărime) întrebare unică);
UniQuestion ca restricț ie de tabel:
Creează tabel nume_tabel
(numele coloanei tip de date (size),columnname tip de date (dimensiune)…întrebareUni
(numelecoloanei,numelecoloanei));

Conceptul de valoare implicită: La momentul creării celulei, o valoare implicita poate fi atribuită.
Când utilizatorul încarcă un record cu valori ș i lasă această celulă goală, DBA
va încărca automat această celulă cu valoarea implicită specificată. Tipul de date al
valoarea implicită ar trebui să se potrivească cu tipul de date al coloanei

Sintaxă:
Creează tabel nume_tabel
(numele coloanei tip de date (dimensiune) valoare implicită,....);

Conceptul de cheie externă: Cheia externă reprezintă relaț ia dintre tabele.


cheia este o coloană ale cărei valori sunt derivate din cheia primară a aceleaș i coloane sau a uneia similare
alte tabel. existenț a cheii externe implică faptul că tabelul cu cheia externă este
referitor la tabelul cheie primară din care este derivată cheia străină. O cheie străină
trebuie să aibă un corespondent al valorii cheii primare în tabela cheii primare pentru a avea semnificaț ie.
Cheia străină ca o constrângere de coloană

Sintaxă :
Creează tabel cu numele
(numele coloanei tip de date (dimensiune) face referire la numele unei alte tabele);

Cheia străină ca o constrângere a tabelului:


Sintaxă :
Creează numele tabelului
(numele coloanei tipul de date (dimensiune)….
cheie primară (numele coloanei);
cheie străină (numele coloanei) se referă la numele tabelului);

Verifică restricț iile de integritate: Foloseș te restricț iile de verificare atunci când trebuie să impui
reguli de integritate care pot fi evaluate pe baza unei expresii logice, iată câteva
exemple de constrângeri de verificare adecvate.
Un nume de constrângere de verificare a coloanei name din coient_master astfel încât numele să fie
INTRODUSE ÎN MAI MARE
O constrângere de verificare pe coloana client_no a client_master astfel încât să nu existe
valoarea client_no începe cu 'c'

Sintaxă:
Crează tabelul nume_tabel
(numele coloanei tip de date (dimensiune) CONSTRÂNGERE numele_constrângerii)
Verifică (expresie));

Output:

Răspuns1.

i. Crea ț i tabelul sales_master.

Query:

creează tabelul vânzări_master (


salesman_no varchar(6) not null primary key check(salesman_no like 's%')
sal_name varchar2(20) not null,
adresa varchar2(20) nu este nulă,
city varchar2(20),
stare varchar2(20)
cod poștal (6)
sal_amt număr(8,2) не nul verificați (sal_amt>0),
tgt_to_get număr(6,2) nu null verifica(tgt_to_get>0),
vânzări_ytd număr(6,2) nu null verificare(vânzări_ytd>0)
remarks varchar2(30));

Result:
ii. Crea ț i tabelul de comenzi de vânzare.

Întrebare:

creați tabelul comenzi_vânzări (


s_order_no varchar(6) nu nul cheie primară verificați(s_order_no ca '0%')
s_order_date date not null,
client_no varchar2(25),
dely_add varchar2(6)
salesman_no varchar2(6),
dely_type char(1) default 'f',
billed_yn char(1)
dely_date date ,
order_status varchar2(10),
verifica (starea_comenzii în ('în proces', 'îndeplinită', 'comandă înapoi', 'anulată'))
verifică (dely_type în ('p','f'))
verifică(dely_date>s_order_date),
restricție fk_salesman_no cheie străină (salesman_no) face referire la sales_master(salesman_no));

Result:

[Link]ă tabelul sales_order_details.

Interogare:

creați tabelul detalii comenzi vânzări


(
s_order_no varchar2(6) nu nul,
product_no varchar2(6) not null
qty_order number,
qty_display număr,
product_rate number(10,2)
constraint pk_sod cheie primară (s_order_no,product_no),
restricție fk_s_o_n cheie străină (s_order_no) face referire la sales_order(s_order_no),
constraint fk_P_n foreign key (product_no) references product_master(product_no));

Result:
[Link] date in tabelul sales_master.

Interogare:

inserează în vânzările_master număr_vânzător, nume_vânzător, adresă, oraș, stat, cod_p Postal


sal_amt,tgt_to_get,ytd_sales,remarks)values('s00001','Kiran','a/14 worli',
'Bombay','Maharashtra','400002','3000','100','50','good');
insera în vânzări_stăpân (număr_vânzător, nume_sal, adresă, oraș, stat, cod poștal)
sal_amt,tgt_to_get,ytd_sales,remarks)values ('s00002','Manish','65 nariman',
'Bombay','Maharashtra','400001','3000','200','100','good');
inserați în sales_master (număr_vânzător, nume_vânzător, adresă, oraș, stat, cod_postal)
sal_amt,tgt_to_get,ytd_sales,remarks)values ('s00003','Ravi','p-7 bandra',
'Bombay','Maharashtra','400032','3000','200','100','good');
introduce în sales_master (număr_vânzător, nume_vânzător, adresă, oraș, stat, cod_poștal,
sal_amt,tgt_to_get,ytd_sales,remarks)values ('s00004','Ashish','a/5 juhu'
,'Bombay','Maharashtra','400044','3500','200','150','good');

Result:

[Link] ț i date în tabela sales_order.

Interogare:

inserare în comanda_de_vânzare(s_order_no,s_order_date,număr_client,tip_livrare,
billed_yn,salesman_no,dely_date,order_status)values ('019001','12-jan-96',
'0001','f','n','s00001','20-jan-96','in process');
introduce în comanda_de_vânzare(s_ordine_nr,s_data_ordine,client_nr,tip_livrare,
billed_yn,salesman_no,dely_date,order_status)values ('019002','25-jan-96',
'0002','p','n','s00002','27-ian-96','anulat');
inserați în comanda_vânzări(s_număr_comandă,data_comenzii,număr_client,tip_livrare,
billed_yn,salesman_no,dely_date,order_status)values ('016865','18-feb-96',
'0003','f','y','s00003','20-feb-96','fulfilled');
inserați în sales_order(s_order_no,s_order_date,client_no,dely_type,
billed_yn,salesman_no,dely_date,order_status)values ('019003','03-apr-96',
'0004','f','y','s00001','7-apr-96','fulfilled');
inserați în sales_order(s_order_no,s_order_date,client_no,dely_type,
billed_yn,salesman_no,dely_date,order_status)values ('046866','20-may-96',
0005,p,n,s00002,22-mai-96,anulat
introduceți în comanda_de_vânzări(s_număr_comandă,s_data_comenzii,client_număr,tip_livrare,
billed_yn,salesman_no,dely_date,order_status)values ('010008','24-may-96',
'0006','f','n','s00004','26-mai-96','în proces');

Result:

Introduceti date în tabela sales_order_details.

Interogare:
introducere în detaliile comenzii de vânzare(s_număr_comandă,număr_produs,qty_comandat,
qty_display,product_rate)values ('019001','p00001','4','4','525');
inserare în detaliile comenzii de vânzări(s_order_no, product_no, qty_order,
qty_display,product_rate)values ('019001','P07965','2','1','8400');
introduceți în detaliile comenzii de vânzări(s_număr_comandă,număr_produs,cantitate_comandată,

qty_display,product_rate)values ('019001','P07885','2','1','5250');
introduce în detaliile comenzii de vânzare(s_order_no,product_no,qty_order,
qty_display,product_rate)values ('019002','p00001','10','0','525');
inserați în detaliile comenzilor de vânzare(s_order_no,product_no,qty_order,
qty_display,product_rate)values ('046865','P07868','3','3','3150');
inserare în detalii_comenzi_de_vânzări(s_numărul_comenzii, numărul_produsului, cantitate_comandată,

qty_display,product_rate)values ('046865','P07885','10','10','5250');
inserați în detaliile comenzii de vânzare(s_order_no,product_no,qty_order,
qty_display,product_rate)values ('019003','p00001','4','4','1050');
inserați în detaliile comenzilor_vânzare(s_număr_comandă,număr_produs,qty_comandă,
qty_display,product_rate)values ('019003','p03453','2','2','1050');
inserați în detaliile comenzii_vânzări(s_order_no, product_no, qty_order,
qty_display,product_rate)values ('046866','p06734','1','1','12000');
inserați în detaliile comenzii de vânzare(s_order_no,product_no,qty_order,
qty_display,product_rate)values ('046866','P07965','1','0','8400');
inserare în detaliile comenzii_vânzării(număr_comandă, număr_produs, cantitate_comandată,
qty_display,product_rate)values ('010008','P07975','1','0','1050');
inserați în detaliile comenzii_vânzării(s_order_no,număr_produs,qty_comandat,
qty_display,product_rate)values ('010008','p00001','10','5','525');

Result:
Relaț ia între tabele după referinț e.
Experimentul 4

Data:

Obiectiv:
Pentru a implementa structura tabelului

Software folosit:
Oracle 12c ș i DataGrip IDE

Întrebare 1. Creează următoarele tabele:

Challan_Header
Numele coloanei tip de date size Attributes
Challan_no varchar2 6 Cheie primară
s_order_no varchar2 6 Referinț ele cheii externe s_order_no de
tabelul comenzilor de vânzare

challan_date data nu nul


billed_yn caracter 1 valori (‘Y’,’N’). Implicit ‘N’

Challan_Details
Numele coloanei tip de date size Attributes
Challan_no varchar2 6 Cheie primară
Product_no varchar2 6 Referinț e de cheie străină la product_master
Qty_disp număr 4,2 nu nul

Q2. Introduceț i următoarele valori în tabelele de antet challan ș i detalii challan:

[Link] No S_order No Challan Date Billed

CH9001 019001 12-DEC-95 Y


CH865 046865 12-NOV-95 Y
CH3965 010008 12-OCT-95 Y

tabelul challan_details

Numărul de Challan Product No Qty Disp


CH9001 P00001 4
CH9001 P07965 1
CH9001 P07885 1
CH6865 P07868 3
CH6865 P03453 4
CH6865 P00001 10
CH3965 P00001 5
CH3965 P07975 2
Q3.–Answer the following questionaries.

Q1. Faceț i cheia primară pe client_no în client_master.


Q2. Adăugaț i o nouă coloană phone_no în tabela client_master.
Q3. Adăugaț i constrângerea not null în tabelul product_master pentru coloanele descriere,
profit percent , sell price and cost price.
Q4. Schimbaț i dimensiunea câmpului client_no din tabela client_master.
Q5. Select product_no, description where profit percent is between 20 and 30 both
inclusiv.

Teorie ș i concepte:

Modificarea structurii tabelelor - Comanda alter table este utilizată pentru a schimba structura
al unui tabel. Folosind clauza alter table nu poț i efectua următoarele sarcini:

(i) schimbă numele tabelului


(ii) schimbă numele coloanei
(iii) ș terge o coloană
(iv) reduceț i dimensiunea unei tabele dacă există date în tabel.

The following tasks you can perform through alter table command.

(i) Adăugarea de coloane noi:


Sintaxă
MODIFICĂ TABELUL tablename
ADĂUGA (numele_noii_colonă noul_tipdate (mărime));

(ii) Modificarea tabelului existent


Sintaxă:
MODIFICA TABELA tablename
MODIFICĂ (numnoucoloană noutipdate (dimensiune));

NOTE: Oracle nu permite restricț iile definite folosind alter table, dacă datele din tabelul
încalcă astfel de constrângeri.

Ș tergerea/Eliminarea Tabelului - Comanda următoare este utilizată pentru a ș terge sau elimina un tabel.

Sintaxă:
Ș tergeț i tabela tablename:

Definirea constrângerilor de integritate în comanda ALTER TABLE

Puteț i de asemenea să definiț i constrângeri de integritate folosind clauza de constrângere în ALTER TABLE
comandă. Următoarele exemple arată definiț iile mai multor constrângeri de integritate.

(1)Adăugaț i CHEIA PRINCIPALĂ-


Sintaxă:
ALTER TABLE tablename
ADĂUGAȚ I CHEIA PRIMARĂ(numele coloanei);

(2) Adăugaț i CHEIE STRĂINĂ


Sintaxă:
MODIFICAȚ I TABELA nume_tabel
ADĂUGAȚ I CONSTRÂNGERE constraintname
CHEIA STRĂINĂ(nume_coloană) REFERĂ la nume_tabel;

Eliminarea constrângerilor de integritate în comanda ALTER TABLE:

Puteț i elimina o constrângere de integritate dacă regula pe care o impune nu mai este adevărată sau dacă
constrângerea nu mai este necesară. Renunț aț i la constrângere folosind comanda ALTER TABLE cu
clauza DROP. Următoarele exemple ilustrează eliminarea constrângerilor de integritate.

(1)Ș TERGE cheia primară-


Sintaxă:
MODIFICĂ TABELUL nume_tabel
RENUNȚ Ă LA CHEIA PRIMARĂ

(2)Ș TERGE CHEIA STRĂINĂ


Sintaxă:
MODIFICĂ TABELUL numele_tabelului

DROP CONSTRAINT numele_constantei;

Output:

Răspuns 1

i. Creare tabel challan_header

Interogare:

create table challan_header(


challan_no varchar2(6) nu null cheie primară,
s_order_no varchar2(6),
challan_date date not null,
billed_yn char(1) default N ,
verifică(billed_yn în ('Y','N'))
restricție fk_so cheie străină (s_order_no) referințează sales_order(s_order_no));
Result:

ii. Creaț i tabelul challan_details

Interogare:

creează tabel challan_details(


challan_no varchar2(6) not null primary key check(challan_no like 'CH%'),
product_no varchar2(6) nu nul check(product_no like 'p%')
qty_display număr(4,2) nu null,
constrângere fk_pn cheie străină (product_no) face referire la product_master(product_no)
);

Result:

RĂSPUNS 2

i. Introduce ț i date în tabela challan_header.

Interogare:

inserează în challan_header (număr_challan,număr_ordine,s_curent_challan,data_challan,facturat_da)


values ('CH9001','019001','12-dec-95','Y');
inserați în header-ul challan (numărul_challan, numărul_comenzii, data_challan, facturat_da)
valori ('CH865','046865','12-nov-95','Y');
inserați în challan_header (număr_challan,număr_comandă,dată_challan,facturat_da)
values ('CH3965','010008','12-oct-95','Y');

Result:
ii. Introduceț i date în tabelul challan_details.

Interogare:

introduceți în detaliile challan (număr challan, număr produs, cantitate afișată)


valori ('CH9001','p00001',4);
introduce în detalii_challan (număr_challan, număr_produs, cantitate_afişare)
valori ('CH9001','p07965',1);
introduceți în detaliile challan (număr_challan, număr_produs, cantitate_afişată)
valori ('CH9001','p07885',1);
introduceți în detalii despre challan (numărul_challan, numărul_produs, cantitate_afisata)
valori ('CH6865','p07868',3);
introduce în detaliile challan (număr challan, număr produs, cantitate afișată)
values ('CH6865','p03453',4);
insera în detaliile challan (număr_challan, număr_produs, cantitate_afisare)
values ('CH6865','p00001',10);
inserează în detaliile challan (număr_challan, număr_produs, cantitate_afisare)
valori ('CH3965','p00001',5);
introduce în detaliile challan (număr_challan, număr_produs, cantitate_afisare)
valori ('CH3965','p07975',2);

Result:

Răspuns 3

i. Face ț i cheia principală să fie client_no în client_master.

Interogare:

modifică tabelul CLIENT_MASTER


modifică client_no nu null cheia principală;
Result:

ii. Adăuga ț i o nouă coloană phone_no în tabela client_master.

Interogare: :

modifică tabelul CLIENT_MASTER


adăugați numărul de telefon(10);
Rezultat

iii. Adăugaț i constrângerea not null în tabelul product_master cu coloanele descriere,


profit percent , sell price and cost price.

Întrebare:

modifică tabela PRODUCT_MASTER astfel încât descrierea să nu fie nulă;


modifică tabela PRODUCT_MASTER pentru a face profit_percent non-null;
modifică tabela PRODUCT_MASTER, setează sell_price ca fiind non-null;
modifică tabelul PRODUCT_MASTER pentru a face cost_price non-null;

Result:(* attributes with circle in bottom right corner represents not null)
iv. Schimbaț i dimensiunea câmpului client_no din tabela client_master.

Interogare:

modifică tabelul CLIENT_MASTER modifica CLIENT_NO varchar2(10);

Result:

v. Selecta ț i product_no, descrierea unde procentul de profit este între 20 ș i 30 inclusiv.

Interogare:

select product_no, description from product_master where profit_percent


între 20 și 30;

Result:
Experimentul 5
Dată:

Obiectiv:
Pentru a implementa conceptele de join-uri.

Software Used:
Oracle 12c ș i DataGrip IDE

Teorie:

Îmbinare a mai multor tabele (îmbinare echivalentă): Uneori, este necesar să tratăm mai mult de o tabelă ca ș i cum
manipulaț i datele din toate tabelele ca ș i cum tabelele nu ar fi obiecte separate, ci un singur obiect
entitate. Pentru a realiza acest lucru, trebuie să unim tabelele. Tabelele sunt unite pe coloana care are aceleaș i date.
tip ș i date în tabele.

Tabelele care trebuie să fie asociate sunt specificate în clauza FROM ș i asocierea
atribute în clauza WHERE.

Algoritm pentru JOIN în SQL:


1. Produsul cartezian al tabelelor (specificat în clauza FROM)
2. Selectarea rândurilor care se potrivesc (predicat în clauza WHERE)
3. Coloana proiect specificată în clauza SELECT.

1. CARTESIAN PRODUCT:-
Consideraț i două tabele, student ș i curs
Selectaț i B.*, P.*
DE la student B, curs P;

2. INNER JOIN:
Produs cartezian urmat de selecț ie
Selectaț i B.*, P.*
DE la student B, Curs P
UNDE [Link] # [Link] # ;

3. JOIN EXTERN STÂNG:


JOIN EXTERN STÂNGA = Produsul cartezian + selecț ie, dar include rânduri din tabela stângă care sunt
valori necorespunzătoare nuluri în valorile atributelor aparț inând celei de-a doua tabele
Examen:
Selecta ț i B.*, P*
DIN student B alătură-te cursului p
PE [Link] # [Link] #;

4. JOIN EXTERN DREPT:


JOIN EXTERN DREAPTA = Produs cartezian + selecț ie dar include rânduri din tabela din dreapta care sunt
nepotrivit

Exam:
Selectaț i B.*, P.*
Din student B JOIN drept curs P
[Link]# = P curs # ;

5. JOIN EXTERN COMPLET


Examen
Selectaț i B.*, P.*
Din student B FULL JOIN curs P
Pe [Link] # = P curs # ;

Chestionare:

1. Afla ț i produsul care a fost vândut lui 'Ivan Sayross.'


2. Afla ț i produsul ș i cantită ț ile care vor trebui livrate.
3. Găse ș te numărul produsului ș i descrierea produselor în mi ș care.
4. Afla ț i numele clien ț ilor care au cumpărat 'CD DRIVE'
5. Lista ț i product_no ș i s_order_no al clien ț ilor care au o cantitate comandată mai mică de 5 din comandă
tabel de detalii pentru produsul „dischete de 1,44”.
6.Găsi ț i produsele ș i cantită ț ile pentru comenzile plasate de 'Vandan Saitwal' ș i 'Ivan'
Bayross.
7.Găsi ț i produsele ș i cantită ț ile acestora pentru comenzile plasate de clientul numărul „ C00001” ș i „ C00002”
8. Găsi ț i numărul comenzii, numărul clientului ș i numărul vânzătorului unde un client a fost primit de mai mult de
un vânzător.
[Link] ș aț i data comenzii în formatul „ zz-ll-aa” de exemplu „ 12-feb-96”
10. Găseș te data, peste 15 zile de la dată.

Tabele:

i. Master produs
ii. Client master

iii. Comanda de vânzare

iv. Detalii comanda de vânzare

Output:

1. Afla ț i produsul care a fost vândut lui 'Ivan Sayross.'

Interogare:

SELECT PRODUCT_MASTER.DESCRIPTION
DIN PRODUS_MASTER
JOIN INTERIOR DETALII_COMENZI_PE ON PRODUS_MASTER.PRODUCT_NO =
SALES_ORDER_DETAILS.PRODUCT_NO
INNER JOIN SALES_ORDER ON SALES_ORDER_DETAILS.S_ORDER_NO = SALES_ORDER.S_ORDER_NO
INNER JOIN CLIENT_MASTER PE SALES_ORDER.CLIENT_NO = CLIENT_MASTER.CLIENT_NO UNDE
CLIENT_MASTER.NAME CA 'ivan';

2. Afla ț i produsul ș i cantită ț ile care trebuie livrate.

Interogare:

SELECT DISTINCT PRODUCT_MASTER.DESCRIPTION,SUM(SALES_ORDER_DETAILS.QTY_ORDER)


DIN PRODUCT_MASTER, DETALII ORDINE VÂNZARE
UNDE PRODUCT_MASTER.PRODUCT_NO = SALES_ORDER_DETAILS.PRODUCT_NO
GRUPAȚI DUPĂ DESCRIEREA_PRODUCT_MASTER;

3. Găsi ț i numărul produsului ș i descrierea produselor în mi ș care.

Întrebare:

SELECT DISTINCT PRODUCT_MASTER.DESCRIPTION, PRODUCT_MASTER.PRODUCT_NO


DIN PRODUS_MASTER
JOIN INTERIOR DETALII_COMENZI_PE ON PRODUS_MASTER.NUMĂR_PRODUS =
SALES_ORDER_DETAILS.PRODUCT_NO
ÎMBINARE INTERNĂ VÂNZĂRI_ORDINE PE VÂNZĂRI_DETALII_ORDINE.S_NUMĂR_ORDINE = VÂNZĂRI_ORDINE.S_NUMĂR_ORDINE
UND WHERE SALES_ORDER.ORDER_STATUS LIKE 'ÎN PROCES';

4. Afla ț i numele clien ț ilor care au cumpărat 'CD DRIVE'.

Interogare:

SELECT CLIENT_MASTER.NAME
DIN CLIENT_MASTER
INNER JOIN SALES_ORDER PE CLIENT_MASTER.CLIENT_NO = SALES_ORDER.CLIENT_NO
INNER JOIN SALES_ORDER_DETAILS S ON SALES_ORDER.S_ORDER_NO = S.S_ORDER_NO
INNER JOIN PRODUCT_MASTER MASTER2 PE S.PRODUCT_NO = MASTER2.PRODUCT_NO UNDE
[Link] CA 'CD_DRIVE';

5. Listează product_no ș i s_order_no al clien ț ilor care au cantitatea comandată mai mică
decât 5 din tabelul de detalii ale comenzii pentru produsul „dischete de 1,44”.

Interogare:

SELECT SALES_ORDER_DETAILS.S_ORDER_NO, SALES_ORDER_DETAILS.PRODUCT_NO


DIN DETALIILE COMENZILOR DE VÂNZARE
INNER JOIN PRODUCT_MASTER MASTER2 PE SALES_ORDER_DETAILS.PRODUCT_NO =
[Link]ĂR_PRODUCȚIE UNDE
[Link] CA '1.44FLOPPIES' ȘI SALES_ORDER_DETAILS.QTY_ORDER <5;
6. Găsi ț i produsele ș i cantită ț ile pentru comenzile plasate
de 'Vandan Saitwal' ș i 'Ivan Bayross'.

Interogare:

SELECT PRODUCT_MASTER.DESCRIPTION, S.QTY_ORDER


DIN PRODUCT_MASTER
INTRANSACTIUNE JOIN DETALII_COMENZI_SALE S PE PRODUCT_MASTER.NUMAR_PRODUC PE S.NUMAR_PRODUC
INNER JOIN SALES_ORDER SO ON S.S_ORDER_NO = SO.S_ORDER_NO
INNER JOIN CLIENT_MASTER ON SO.CLIENT_NO = SYSTEM.CLIENT_MASTER.CLIENT_NO UNDE
CLIENT_MASTER.NAME CA 'VANDAN' SAU CLIENT_MASTER.NAME CA 'IVAN';

7. Găsi ț i produsele ș i cantită ț ile pentru comenzile plasate de


client_no “ C00001” and “C00002”.

Query:

SELECT PRODUCT_MASTER.DESCRIPTION, S.QTY_ORDER


DIN PRODUCT_MASTER
INNER JOIN SALES_ORDER_DETAILS S ON PRODUCT_MASTER.PRODUCT_NO = S.PRODUCT_NO
INNER JOIN SALES_ORDER SO ON S.S_ORDER_NO = SO.S_ORDER_NO
INNER JOIN CLIENT_MASTER PE SO.CLIENT_NO = SYSTEM.CLIENT_MASTER.CLIENT_NO UNDE
CLIENT_MASTER.CLIENT_NO CA '0001' SAU CLIENT_MASTER.CLIENT_NO CA '0002';

8. Găse ș te numărul comenzii, numărul clientului ș i numărul vânzătorului, unde un client a fost
primit de mai mulț i vânzători.

Interogare:

SELECT SALES_ORDER.CLIENT_NO,SALES_ORDER.SALESMAN_NO,SALES_ORDER.S_ORDER_NO DIN


ORDINE_DE_VÂNZARE ÎN CARE ORDINE_DE_VÂNZARE.CLIENT_NO = (SELECT ORDINE_DE_VÂNZARE.CLIENT_NO
DIN COMANDA_DE_VÂNZARE GRUPAȚI DUPĂ COMANDA_DE_VÂNZARE.CLIENT_NO
AVÂND NUMĂRUL(SALES_ORDER.CLIENT_NO)>1);
[Link] ș aț i data comenzii în formatul „ zz-ll-aa” de exemplu „ 12-feb-96”.

Query:

SELECT TO_CHAR(SYSDATE, 'DD/MM/YY')


DIN DUAL;

10. Găseș te data, 15 zile după dată.

Interogare:

SELECT SYSDATE+15 MYDATE FROM DUAL;


Experimentul 6
Dată:

Obiectiv:
Pentru a implementa conceptele de grupare a datelor.

Software utilizat:
Oracle 12c & DataGrip IDE

Teorie:

Gruparea datelor din tabele:


Există circumstanț e în care am dori să aplicăm funcț ia agregată nu doar la un singur
set de tuple, dar ș i unui grup de seturi de tuple, specificăm această dorinț ă în SQL folosind group by
clauză. Atributul sau atributele date în clauza group by sunt folosite pentru a forma grupuri. Tuple
cu aceeaș i valoare pentru toate atributele în clauza group by sunt plasate într-un singur grup.
Sintaxă:
SELECT numele coloanei, numele coloanei
DIN numele_tabelei
GRUPEAZĂ DUPĂ numele coloanei;
Uneori este util să enunț i o condiț ie care se aplică grupurilor mai degrabă decât tuplurilor. De exemplu
s-ar putea să fim interesaț i doar de acele filiale unde soldul mediu al contului este mai mare decât
1200. Această condiț ie nu se aplică unui singur tuplu, ci se aplică fiecărui grup construit
prin clauza GROUP BY. Pentru a exprima o astfel de întrebare, folosim clauza having din SQL. SQL
se aplică predicatelor în cazul în care pot fi folosite.
Sintaxă:
SELECT numele_columnei, numele_columnei
DIN numele_tabelei
GRUPARE DUPĂ numele coloanei;
AVÂND condiț ia de căutare;

Chestionare:

Q1.- Print the description and total quantity sold for each product.
Q2.- Găsiț i valoarea fiecărui produs vândut.
Q3.- Calculaț i cantitatea medie vândută pentru fiecare client care are o valoare maximă a comenzii de 15000.
Q4.- Aflaț i produsele care au fost vândute lui Ivan.
Q5.-Găsiț i numele clienț ilor care au 'Unitate CD'.
Q6.-Găsiț i produsele ș i cantităț ile acestora pentru comenzile plasate de 'Vandana' ș i 'Ivan'.
Q7.- Selectaț i product_no, total qty_ordered pentru fiecare produs.
Q8.- Selectaț i product_no, descrierea produsului ș i cantitatea comandată pentru fiecare produs.
Q9.- Afiș aț i numărul comenzii ș i ziua în care clienț ii au plasat comanda.
Q10.- Afiș aț i luna ș i data când comanda trebuie livrată.

Output:

i. Imprima ț i descrierea ș i cantitatea totală vândută pentru fiecare produs.

Interogare:

SELECT DISTINCT PRODUCT_MASTER.DESCRIPTION,SUM(SALES_ORDER_DETAILS.QTY_ORDER)


DIN PRODUS_MASTER
INNER JOIN DETALII_COMENZI_VÂNZARE ON PRODUS_MASTER.NR_PRODUS =
SALES_ORDER_DETAILS.PRODUCT_NO
GRUPARE DUPĂ PRODUS_MASTER.DESCRIERE;

ii. Găsiț i valoarea fiecărui produs vândut.

Interogare:

SELECT DISTINCT PRODUCT_MASTER.DESCRIPTION, SALES_ORDER_DETAILS.PRODUCT_RATE


DIN PRODUCT_MASTER
ATELIER UNDE DETALIILE COMENZILOR PE PRODUS ÎN PRODUSUL MASTER.PRODUCT_NO =
SALES_ORDER_DETAILS.PRODUCT_NO;
iii. Calcula ț i cantitatea medie vândută pentru fiecare client care are o
valoarea maximă a comenzii de 15000.

Interogare:

SELECT CLIENT_MASTER.NAME, AVG(DISTINCT SALES_ORDER_DETAILS.QTY_ORDER)


DIN DETALIILE COMENZILOR DE VÂNZARE
INNER JOIN SALES_ORDER S ON SALES_ORDER_DETAILS.S_ORDER_NO = S.S_ORDER_NO
JOIN INTERNE CLIENT_MASTER PE S.CLIENT_NO= CLIENT_MASTER.CLIENT_NO
GROUP BY CLIENT_MASTER.NAME, SALES_ORDER_DETAILS.S_ORDER_NO
AVÂND SUMA(DISTINCT SALES_ORDER_DETAILS.PRODUCT_RATE) > 15000;

iv. Afla ț i produsele care au fost vândute lui Ivan.

Interogare:

SELECT PRODUCT_MASTER.DESCRIPTION
DIN PRODUS_MASTER
INNER JOIN DETALII_COMENZI_VÂNZĂRI ON PRODUS_MASTER.NUMAR_PRODUS =
SALES_ORDER_DETAILS.PRODUCT_NO
INNER JOIN SALES_ORDER ON SALES_ORDER_DETAILS.S_ORDER_NO = SALES_ORDER.S_ORDER_NO
INNER JOIN CLIENT_MASTER ON SALES_ORDER.CLIENT_NO = CLIENT_MASTER.CLIENT_NO UNDE
CLIENT_MASTER.NAME CA 'ivan';
v. Găsiț i numele clienț ilor care au 'CD Drive'.

Interogare:

SELECT CLIENT_MASTER.NAME
DIN DETALIILE COMENZII DE VÂNZARE
JOIN INTERIOR ÎN COMENZILE DE VÂNZARE PE SALES_ORDER_DETAILS.S_ORDER_NO = SALES_ORDER.S_ORDER_NO
INNER JOIN CLIENT_MASTER PE SALES_ORDER.CLIENT_NO = CLIENT_MASTER.CLIENT_NO
INNER JOIN PRODUCT_MASTER MASTER2 pe SALES_ORDER_DETAILS.PRODUCT_NO =
MASTER2.PRODUCT_NO UNDE
[Link] CA 'CD_drive';

găsiț i produsele ș i cantităț ile acestora pentru comenzile plasate de 'Vandana' ș i 'Ivan'.

Interogare:

SELECT PRODUCT_MASTER.DESCRIPTION, S.QTY_ORDER


DIN PRODUCT_MASTER
INNER JOIN SALES_ORDER_DETAILS S ON PRODUCT_MASTER.PRODUCT_NO = S.PRODUCT_NO
INNER JOIN SALES_ORDER SO ON S.S_ORDER_NO = SO.S_ORDER_NO
INNER JOIN CLIENT_MASTER PE SO.CLIENT_NO = SYSTEM.CLIENT_MASTER.CLIENT_NO UNDE
CLIENT_MASTER.NAME CA 'Vandan' sau CLIENT_MASTER.NAME ca 'ivan';
vii. Selecta ț i product_no, cantitatea totală comandată pentru fiecare produs.

Interogare:

SELECT DISTINCT PRODUCT_MASTER.PRODUCT_NO, SUM(S.QTY_ORDER)


DIN PRODUS_MASTER
INNER JOIN SALES_ORDER_DETAILS S on PRODUCT_MASTER.PRODUCT_NO = S.PRODUCT_NO
JOIN INTERIOR COMENZI_DE_VÂNZARE SO pe S.S_ORDER_NO = SO.S_ORDER_NO
INNER JOIN CLIENT_MASTER ON SO.CLIENT_NO = SYSTEM.CLIENT_MASTER.CLIENT_NO
GRUPARE DUPĂ PRODUCT_MASTER.PRODUCT_NO;

viii. Selectaț i product_no, descrierea produsului ș i cantitatea comandată pentru fiecare produs.

Interogare:

SELECT DISTINCT PRODUCT_MASTER.PRODUCT_NO, PRODUCT_MASTER.DESCRIPTION,


SUM(S.QTY_ORDER)
DIN PRODUCT_MASTER
INNER JOIN DETALII_COMENZI_VÂNZĂRI S ON MASTER_PRODUSE.NUMĂR_PRODUCȚIE = [Link]ĂR_PRODUCȚIE
UN JOIN INTERIOR SALES_ORDER SO pe S.S_ORDER_NO = SO.S_ORDER_NO
INNER JOIN CLIENT_MASTER PE SO.CLIENT_NO = SYSTEM.CLIENT_MASTER.CLIENT_NO
GRUPARE DUPĂ PRODUCT_MASTER.PRODUCT_NO, PRODUCT_MASTER.DESCRIPTION;
ix. Selectaț i product_no, descrierea produsului ș i cantitatea comandată pentru fiecare produs.

Interogare:

SELECT TO_CHAR(SALES_ORDER.S_ORDER_DATE,'ZIUA'),SALES_ORDER.S_ORDER_NO
DIN COMANDA_DE_VÂNZARE;

x. Afiș aț i luna ș i data când comanda trebuie livrată.

Query:

SELECT TO_CHAR(SALES_ORDER.S_ORDER_DATE,'LUNĂ'),SALES_ORDER.DELY_DATE
DIN COMANDA_DE_VÂNZARE;
Experimentul 7
Dată:

Obiectiv:
Pentru a implementa conceptele de vizualizare ș i indexuri.

Software Used:
Oracle 12c ș i IDE DataGrip

Teorie:

Indexes:
Un index este o listă ordonată a conț inutului unei coloane sau a unui grup de coloane dintr-un tabel. Un index creat
pe coloana unică a tabelului se numeș te index simplu. Când mai multe coloane ale tabelului sunt
inclus în index este numit index compus.

Crearea unui index pentru un tabel:-

Sintaxă (Simplă)
CREAȚ I INDEX index_name
PE numele_tabelei(numele coloanei);
Indice compus:-
CREAȚ I INDEX index_name
PE numele_tabelului(numele_colonelor,numele_colonelor);

Crearea unui Index UniQuestion:-


CREAȚ I INDEX UNIQUESTION indexfilename
PE numele_tabelei(numele_colunei);
Eliminarea Indecș ilor:-
Un index poate fi eliminat folosind DROP INDEX
Sintaxă:-
DROP INDEX indexfilename;

Views:
Datele logice sunt modul în care dorim să vedem datele curente din baza noastră de date. Datele fizice sunt modul în care
aceaste date sunt de fapt plasate în baza noastră de date.
Vederile sunt măș ti plasate peste tabele. Acest lucru permite programatorului să dezvolte o metodă
prin care putem afiș a date predefinite utilizatorilor în conformitate cu dorinț a noastră.
Vizualizările pot fi create pentru următoarele motive:

1. DBA-ul stochează vederile doar ca definiț ie. Prin urmare, nu există duplicare de date.
2. Simplifică Chestionarele.
3. Can be Questionried as a base table itself.
4. Oferă securitatea datelor.
5. Evită redundanț a datelor.

Crearea de Vederi:-

Sintaxă:-
CREAȚ I VEDERE viewname CA
SELECT nume_coloană,nume_coloană
DIN numele_tabelei
UNDE numele_coloanei=lista_expr;

Renaming the columns of a view:-

Sintaxă:-
CREAȚ I VIZUALIZAREA viewname AS
SELECT newcolumnname….
DIN nume_tabel
UNDE numele_colonne=lista_expresiilor;

Selectarea unui set de date dintr-o vedere -

Sintaxă:-
SELECT nume_coloană, nume_coloană
DIN viewname
UNDE condiț ia de căutare;

Destroying a view-

Sintaxă:-
DROP VIEW nume_vizualizare;

Chestionare:

Q1. Creaț i un index pe tabela client_master, câmpul client_no.


Q2. Creaț i un index pe tabela sales_order, câmpul s_order_no.
Q3. Creaț i un index compus pe tabela sales_order_details pentru coloanele
s_order_no ș i product_no.
Q4. Creaț i un index compus ch_index pe tabela challan_header pentru coloanele
challan no and s_order_no.
Q5. Creaț i un index uniQuestion pe tabela salesman_master, câmpul salesman_no.
Q6. Ș terge indexul ch_index de pe tabela challan_header.
Q7. Creaț i o vedere asupra salesman_master al cărui sal_amt este mai mic de 3500.
Q8. Creează o vizualizare client_view pe client_master ș i redenumeș te coloanele ca nume, add1,
add2, city, pcode, state respectively.
Q9. Selectaț i numele clienț ilor din client_view care locuiesc în oraș ul 'Bombay'.
Q10. Ș terge vederea client_view.

Output:

[Link]ă un index pe tabela client_master, câmpul client_no.

Întrebare:

CREAȚI INDEXUL SYS_C0012103


PE CLIENT_MASTER(CLIENT_NO);

ii. Crează un index pe sales_order, câmpul s_order_no.

Query:

CREAȚI INDEX SYS_C0012070


PE COMANDA_DE_VÂNZARE(S_ORDER_NO);

iii. Creaț i un index compus pe tabela sales_order_details pentru coloanele


s_order_no ș i product_no.

Întrebare:

CREAȚI INDEX PK_SOD


PE DETALII_COMENZI(S_NUMĂ_COMANDĂ, NUMĂ_PRODUS);

iv. Creaț i un index compus ch_index pe tabela challan_header pentru coloanele


challan no and s_order_no.

Interogare:

CREAZĂ INDEX CH_INDEX


PE CHALLAN_HEADER (CHALLAN_NO, S_ORDER_NO);

v. Crea ț i un index uniQuestion pe tabela salesman_master, câmpul salesman_no.

Întrebare:
CREAȚI INDEX UNIC SYS_C0012063
PE SALES_MASTER (NUMĂR_VÂNZĂTOR);

vi. Elimină indexul ch_index de pe tabela challan_header.

Interogare:

DROP INDEX CH_INDEX;

vii. Creează o vedere pe salesman_master al cărei sal_amt este mai mic de 3500.

Interogare:

CREAȚI VIZUALIZARE SPSAL CA


SELECT * DIN SALES_MASTER
UNDE SALES_MASTER.SAL_AMT <3500;

viii. Creaț i o vedere client_view pe client_master ș i redenumiț i coloanele


as name, add1, add2, city, pcode, state respectively.

Interogare:

CREAȚI VIZUALIZARE CLIENT_VIEW CA SELECTAȚI CLIENT_MASTER.CLIENT_NO


AS CNO, CLIENT_MASTER.NAME AS CNAME, CLIENT_MASTER.ADDRESS1 AS ADD1
CLIENT_MASTER.ADDRESS2 AS ADD2, CLIENT_MASTER.BAL_DUE AS BD,CLIENT_MASTER.CITY AS
CCITY,CLIENT_MASTER.STATE CSTATE, CLIENT_MASTER.PINCODE PCODE,
CLIENT_MASTER.TELEFON_CA AS PH DIN CLIENT_MASTER;
Selectaț i numele clienț ilor din client_view care locuiesc în oraș ul 'Bombay'.

Interogare:

SELECT * FROM CLIENT_VIEW WHERE CCITY IN 'Bombay';

x. Sterge vederea client_view.

Întrebare:

DROP VIEW CLIENT_VIEW;


Experimentul 8

Dată:

Obiectiv:
Pentru a implementa conceptele de uniune, intersecț ie ș i diferenț ă.

Software Used:
Oracle 12c ș i DataGrip IDE

Theory:

UNIUNE

Returnează o uniune a două instrucț iuni select. Returnează valori unice (distincte) de
ei.

SELECT * FROM table1


UNIUNE
SELECT * FROM table2;

UNION ALL
Similar cu UNION, doar că UNION ALL returnează ș i valorile duplicate.

SELECT * FROM table1


UNION ALL
SELECT * FROM table2;

Când folosiț i UNION ș i UNION ALL, coloanele din instrucț iunile SELECT trebuie să se potrivească.
Acest lucru ar returna o eroare:

SELECT coloana1 DIN tabel1


UNIUNE
SELECT * FROM table2;

MINUS

MINUS (cunoscut ș i sub numele de EXCEPT) returnează diferenț a între primul ș i al doilea
Declaraț ia SELECT. Este cea despre care trebuie să fim atenț i ce declaraț ie va fi
pune primul, deoarece vom obț ine doar rezultatele care sunt în prima instrucț iune SELECT
şi nu în al doilea.

SELECT * FROM table1


MINUS
SELECT * FROM table2;

INTERSECT

INTERSECT este opusul lui MINUS, deoarece ne returnează rezultatele care sunt ambele.
gasit în prima ș i a doua instrucț iune SELECT.
SELECT * FROM table1
INTERSECT
SELECT * FROM table2;

EXEMPLU

Există un exemplu interesant care foloseș te OPERATOARE DE SETURI pentru a compara dacă două
tabelele au valori identice, testând diferenț a simetrică. Dacă rezultatul întregii interogări
nu returnează niciun rând, va însemna că sunt identice.

(SELECT * FROM tabel1


MINUS
SELECT * FROM table2)
UNIUNE
(SELECT * FROM table2
MINUS
SELECT * FROM table1);

ÎNTREBĂRI COMPUSE

Fiecare interogare într-o interogare compusă va proiecta propria sa listă de coloane selectate. Acestea
listele trebuie să aibă acelaș i număr de elemente, să fie nominalizate în aceeaș i succesiune,
ș i să fie de tipuri de date în mare parte similare. Nu trebuie să aibă aceleaș i denumiri (sau
aliasuri de coloană), nici nu trebuie să provină din aceleaș i tabele (sau subinterogări). Dacă
numele coloanelor (sau aliasurile) sunt diferite, setul de rezultate al interogării compuse
vor avea coloane numite exact ca în prima interogare.

Coloanele corespunzătoare din interogările care formează o interogare compusă trebuie să fie
al aceluiaș i grup de tip de date. Setul de rezultate al interogării compuse va avea
coloane cu un nivel mai ridicat de precizie.

UNION, MINUS ș i INTERSECT vor combina întotdeauna seturile de rezultate ale intrării
interogări, apoi sortează rezultatele pentru a elimina rândurile duplicate. Dacă ordinea de sortare (care este

în ordine ascendentă, în funcț ie de ordinea în care apar coloanele


apare în listele selectate) nu este ordinea dorită, este posibil să pui un singur
Clauza ORDER BY la sfârș itul interogării compuse. Nu este posibil să se folosească ORDER
PRIN în oricare dintre interogările care compun întreaga interogare compusă, deoarece aceasta ar
interrompe sortarea care este necesară pentru a elimina duplicatele. UNION ALL este
excepț ia de la regula de sortare-fără-duplicate: seturile de rezultate ale celor două interogări de intrare

vor fi concatenate pentru a forma rezultatul interogării compuse.

Controlează ordinea rândurilor returnate

Nu este posibil să foloseș ti ORDER BY în interogările individuale care formează o


interogare compusă. O clauză ORDER BY poate fi adăugată la sfârș itul unei compuse
întrebare.

Chestionare:
1. Selecta ț i distinct s_order_no din comenzile de vânzări ș i numărul comenzii de vânzări.
2. Selecta ț i toate s_order_no din comanda de vânzări ș i numărul comenzii de vânzări.
[Link] ț i numerele clien ț ilor doar pentru acei clien ț i care au o comandă de vânzare.
[Link] ț i numerele de clien ț i care nu au comenzi de vânzare.

Output:

i. Selectaț i numărul de comandă distinct s_order_no din comanda de vânzări ș i numărul comenzii de vânzări.

Întrebare:

SELECT S_ORDER_NO DIN SALES_ORDER


UNIUNE
SELECT S_ORDER_NO DIN DETALIILE COMENZILOR DE VÂNZARE;
ii. Selectaț i toate s_order_no din comanda de vânzare ș i numărul comenzii de vânzare.

Interogare:

SELECT S_ORDER_NO DIN SALES_ORDER


UNION ALL
SELECT S_ORDER_NO DIN DETALII_COMENZI_VÂNDĂRI;

iii. Selectaț i numerele clienț ilor doar pentru acei clienț i care au o comandă de vânzare.

Întrebare:

SELECT CLIENT_NO DIN SALES_ORDER


INTERSECTA
SELECT CLIENT_NO DIN CLIENT_MASTER;
iv. Selectaț i numerele de clienț i ale clienț ilor care nu au comenzi de vânzare.

Query:

SELECT NUMĂR_CLIENT DIN CLIENT_MASTER


MINUS
SELECT CLIENT_NO FROM SALES_ORDER;
Experimentul 9

Dată:

Obiectiv:
Pentru a implementa baza PL/SQL.

Software Used:
Oracle 12c

Teorie:

PL/SQL este o combinaț ie de SQL împreună cu caracteristicile procedurale ale programării


limbajelor. A fost dezvoltat de Oracle Corporation la începutul anilor '90 pentru a îmbunătăț i
capabilităț ile SQL. PL/SQL este una dintre cele trei limbaje de programare cheie incluse în
Oracle Database, împreună cu SQL-ul în sine ș i Java.

Limbajul de programare PL/SQL a fost dezvoltat de Oracle Corporation la sfârș itul


anii 1980 ca limbaj de extensie procedural pentru SQL ș i baza de date relaț ională Oracle.
Următoarele sunt anumite fapte notabile despre PL/SQL −

PL/SQL este un procesor de tranzac ț ii complet portabil ș i de înaltă performan ț ă


limbă.
PL/SQL oferă un limbaj de programare integrat, interpretat ș i independent de sistemul de operare

mediu.
PL/SQL poate fi, de asemenea, apelat direct din interfaț a de linie de comandă SQL*Plus.

Un apel direct poate fi realizat ș i din apeluri de limbaj de programare externe la


bază de date.
Sintaxa generală a PL/SQL se bazează pe cea a programării ADA ș i Pascal
limbă.
Pe lângă Oracle, PL/SQL este disponibil în TimesTen în memorie
bază de date ș i IBM DB2.
CaracteristicialePL/SQL

PL/SQL are următoarele caracteristici −

PL/SQL este strâns integrat cu SQL.


Oferă verificări extinse ale erorilor.
Oferă numeroase tipuri de date.
Oferă o varietate de structuri de programare.
Suportă programarea structurată prin funcț ii ș i proceduri.
Suportă programarea orientată pe obiect.
Susț ine dezvoltarea aplicaț iilor web ș i a paginilor de server.

AvantajelePL/SQL

PL/SQL are următoarele avantaje −


SQL este limbajul standard de baze de date, iar PL/SQL este integrat puternic cu
SQL. PL/SQL suportă atât SQL static, cât ș i dinamic. SQL static suportă DML
operaț iuni ș i controlul tranzacț iilor din blocul PL/SQL. În SQL dinamic, SQL
permite încorporarea instrucț iunilor DDL în blocuri PL/SQL.

PL/SQL permite trimiterea unui întreg bloc de instrucț iuni către baza de date într-o singură
timp. Aceasta reduce traficul de reț ea ș i oferă performanț e ridicate pentru
aplicaț ii.
PL/SQL oferă o productivitate ridicată programatorilor, deoarece poate interoga, transforma ș i
actualizaț i datele într-o bază de date.

PL/SQL economise ș te timp în design ș i depanare prin caracteristici puternice, cum ar fi


gestionarea excep ț iilor, încapsularea, ascunderea datelor ș i datele orientate pe obiect
tipuri.
Aplicaț iile scrise în PL/SQL sunt complet portabile.
PL/SQL oferă un nivel ridicat de securitate.

PL/SQL oferă acces la pachete SQL predefinite.


PL/SQL oferă suport pentru programarea orientată pe obiect.
PL/SQL oferă suport pentru dezvoltarea aplicaț iilor Web ș i a paginilor de server.

Fiecare instrucț iune PL/SQL se încheie cu un punct ș i virgulă (;). Blocurile PL/SQL pot fi învăluite în interiorul.

alte blocuri PL/SQL folosind BEGIN ș i END. Următoarea este structura de bază a unui
Bloc PL/SQL -
DECLARĂ
<secțiunea declarațiilor>
ÎNCEPE
<comandă executabilă>
EXCEPȚIE
<gestionarea excepțiilor>
SFÂRȘIT;

Chestionarele:

[Link] a message on the output console.


[Link]ăuga ț i două numere ș i afi ș aț i rezultatul.
3. Afi ș aț i media a trei numere.
4. Scrie un bloc de cod PL/SQL pentru a găsi factorialul unui număr.
[Link] ș ează suma primelor zece numere naturale.
[Link] ț i numele ș i salariul angajatului John.

Output:

i. Tipăriț i un mesaj pe consola de ieș ire.

Interogare:

DECLARĂ
MESSAGE VARCHAR2(20):= 'HELLO, WORLD!';
ÎNCEPE
DBMS_OUTPUT.PUT_LINE(MESAJ);
SFÂRȘIT;
ii. Adăugaț i două numere ș i afiș aț i rezultatul.

Interogare:

DECLARA
A NUMBER:=5;
B NUMĂR:=6;
C INTEGER;
ÎNCEPE
C := A + B;
DBMS_OUTPUT.PUT_LINE('C: ' || C);
SFÂRȘ IT;

iii. Afiș ează media a trei numere.

Interogare:

DECLAR
UN NUMĂR:=&A;
B NUMĂR:=&B;
C NUMĂR:=&C;
NUMĂR SM;
AV NUMBER;
ÎNCEPE
SM:=A+B+C;
AV:=SM/3;
DBMS_OUTPUT.PUT_LINE('SUMA = '||SM);
DBMS_OUTPUT.PUT_LINE('MEDIA = '||AV);
SFÂRȘIT;
iv. Scrieț i un bloc de cod PL/SQL pentru a găsi factorialul unui număr.

Interogare:

DECLARA
N NUMĂR;
NUMĂRUL I;
F NUMĂR:=1;
ÎNCEP
N:=&N;
PENTRU I ÎN 1..N
BUCLO
F:=F*I;
INCHIDE CICLUL;
DBMS_OUTPUT.PUT_LINE(N||'! = '||F);
SFÂRȘIT;

v. Tipăriț i suma primelor zece numere naturale.

Interogare:

DECLARĂ
N NUMĂR:=10;
NUMĂRUL I;
SUM1 NUMBER:=0;
ÎNCEPE
PENTRU I ÎN 1..N
BUCLĂ
SUM1:=SUM1+I;
SFÂRȘIT CICLU;
DBMS_OUTPUT.PUT_LINE('SUMA PRIMELOR ZECE NUMERE NATURALE ESTE: ' || SUM1);
SFÂRȘIT;
vi. Print the name and salary of the employee John.

Interogare:

DECLARA
B [Link]%TIP;
C [Link]%TIP;
ÎNCEPE
SELECT NAME, SALARY ÎN B, C DIN EMP UNDE NAME = 'JOHN';
DBMS_OUTPUT.PUT_LINE(B || ' ' || C);
SFÂRȘIT;
Experimentul 10

Dată:

Obiectiv:
Pentru a implementa conceptul de cursoare.

Software Used:
Oracle 12c

Teorie:

Oracle creează o zonă de memorie, cunoscută sub numele de zonă de context, pentru procesarea unui SQL

declaraț ie, care conț ine toate informaț iile necesare pentru procesarea declaraț iei;
de exemplu, numărul de rânduri procesate, etc.
Acursoris este un pointer către această zonă de context. PL/SQL controlează zona de context printr-o
cursor. Un cursor păstrează rândurile (unu sau mai multe) returnate de o declaraț ie SQL. Setul
numărul de rânduri pe care cursorul le deț ine se numeș te setul activ.

Poț i numi un cursor astfel încât să poată fi referit într-un program pentru a obț ine ș i procesa
rândurile returnate de instrucț iunea SQL, câte unul pe rând. Există două tipuri de cursori

Cursori implici
Cursori explicaț i

ImplicitCursors

Cursurile implicite sunt create automat de Oracle ori de câte ori o instrucț iune SQL este
executat, când nu există un cursor explicit pentru afirmaț ie. Programatorii nu pot
controlează cursorele implicite ș i informaț iile din acestea.
Ori de câte ori este emis o declaraț ie DML (INSERT, UPDATE ș i DELETE), se creează o implicită
cursorul este asociat cu această declaraț ie. Pentru operaț iunile INSERT, cursorul deț ine
date care trebuie inserate. Pentru operaț iunile UPDATE ș i DELETE, cursorul
identifică rândurile care ar fi afectate.
În PL/SQL, poț i face referire la cel mai recent cursor implicit ca la cursorul SQL, care
întotdeauna are atribute precum %FOUND, %ISOPEN, %NOTFOUND,
şi%ROWCOUNT.

Cursorul SQL are atribute suplimentare, %BULK_ROWCOUNT ș i


%BULK_EXCEPTIONS, proiectat pentru utilizarea cu declaraț ia FORALL. Următoarea
tabelul oferă descrierea atributelor cele mai utilizate–

[Link] Attribute & Description

%GĂSIT
1
Returnează TRUE dacă o instrucț iune INSERT, UPDATE sau DELETE a afectat una sau mai multe rânduri sau o

Comanda SELECT INTO a returnat una sau mai multe rânduri. Altfel, returnează FALSE.

%NEGAȚI

2 Opusul logic al %FOUND. Returnează TRUE dacă o instrucț iune INSERT, UPDATE sau DELETE
nu au fost afectate nicio linie, sau o declaraț ie SELECT INTO nu a returnat nicio linie. Altfel, returnează FALSE.

%ISOPEN

3 Întotdeauna returnează FALSE pentru cursori impliciț i, deoarece Oracle închide automat cursorul SQL
după executarea declaraț iei SQL asociate.

%ROWCOUNT

4 Returnează numărul de rânduri afectate de o instrucț iune INSERT, UPDATE sau DELETE, sau returnat
printr-o declaraț ie SELECT INTO.

CursoriExpliciț i

Cursorii explici sunt cursori defini ț i de programator pentru a ob ț ine mai mult control asupra
zona de context. Un cursor explicit ar trebui să fie definit în secț iunea de declaraț ie a
Blocul PL/SQL. Este creat pe o instrucț iune SELECT care returnează mai mult de unul
rând.
Sintaxa pentru crearea unui cursor explicit este–
CURSOR cursor_name ESTE select_statement;

Lucrul cu un cursor explicit include următorii paș i -

Declararea cursorului pentru iniț ializarea memoriei


Deschiderea cursorului pentru alocarea memoriei
Obț inerea cursorului pentru recuperarea datelor
Închiderea cursorului pentru a elibera memoria alocată

DeclarareaCursorului
Declaraț ia cursorului defineș te cursorul cu un nume ș i SELECT-ul asociat
declaraț ie. De exemplu -

CURSOR c_customers IS

SELECT id,name,address FROM customers;

Deschd
iereaCursoruu
li
Deschiderea cursorului alocă memoria pentru cursor ș i îl pregăteș te pentru
încărcarea rândurilor returnate de instrucț iunea SQL în ea. De exemplu, vom deschide
cursoul definit mai sus după cum urmează −

DESCHIDE c_customers;

RecuperareaCursorului
Obț inerea cursorului implică accesarea unei linii de fiecare dată. De exemplu, vom obț ine
rânduri din cursorul deschis anterior după cum urmează -

FETCH c_customers INTO c_id,c_name,c_addr;

ClosingtheCursor
Închiderea cursorului înseamnă eliberarea memoriei alocate. De exemplu, vom închide
cursorul deschis mai sus după cum urmează −

ÎNCHIDE c_customers;
Chestionare:

1. Folosind un cursor explicit pentru a găsi înregistrările tuturor angaja ț ilor.


2. Utilizarea cursorului implicit pentru a găsi înregistrări specifice ale unui angajat pe nume Alex.

3. Valida ț i inputul folosind excep ț ii.


Actualiza ț i salariul fiecărui angajat cu 500 folosind excep ț ii.

Ieș ire:

i. Folosind cursor explicit pentru a găsi înregistrările tuturor angajaț ilor.

Interogare:

DECLARA
A [Link]%TIP;
CURSOR C1 ESTE SELECT NAME DIN EMP;
ÎNCEPE
OPEN C1;
Bucle
FETCH C1 ÎN A;
IESI CÂND C1%NU_SE_GĂSEȘTE;
DBMS_OUTPUT.PUT_LINE('ANGAJAT' || ' ' || A);
FINALIZEAZĂ CICLUL;

ÎNCHIDE C1;
SFÂRȘIT;

II. Folosind cursorul implicit pentru a găsi înregistrări specifice ale angajatului alex.

Interogare:

DECLARĂ
EMPREC EMP%ROWTYPE;
ÎNCEPE
SELECT * ÎN EMPREC DIN EMP UNDE NAME = 'ALEX';
DBMS_OUTPUT.PUT_LINE(EMPREC.EMP_ID || ' ' || [Link] || ' ' || [Link]);
SFÂRȘIT;
iii. Validaț i intrarea folosind excepț ii.

Întrebare:

DECLARĂ
S NUMĂR:=&S;
EX EXCEPȚIE;
ÎNCEPE
IF (S<=10) THEN RAISE EX;
FINALIZEAZĂ;
EXCEPȚIE
CÂND EX ATUNCI DBMS_OUTPUT.PUT_LINE('ID TREBUIE SĂ FIE MAI MARE DECÂT 10');
SFÂRȘIT;

Când s < 10

Când s >10
iv. Actualizaț i salariul fiecărui angajat cu 500 folosind excepț ia.

Interogare:

DECLAR
TNO NUMĂR(3);
ÎNCEPUT
UPDATE EMP SET SALARY = SALARY + 500;
DACĂ SQL%NU A FOST GĂSIT
ATUNCI DBMS_OUTPUT.PUT_LINE('NU S-AU GĂSIT ÎNREGISTRĂRI');
SFÂRȘIT DACA;
DACĂ SQL%FOUND ATUNCI TNO:= SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE(TNO);
ÎNCHIDE Dacă;

SFÂRȘIT;

Înainte de actualizare:

După actualizare:
Experimentul 11

Dată:

Obiectiv:
Pentru a implementa conceptul de funcț ii ș i proceduri.

Software Used:
Oracle 12c

Teorie:

PROCEDURI:
Un subprogram este o unitate/modul de program care îndeplineș te o sarcină particulară. Acestea
subprogramele sunt combinate pentru a forma programe mai mari. Acest lucru se nume ș te practic
„Design modular”. Un subprogram poate fi invocat de un alt subprogram sau program
care se numeș te programul de apelare.
Un subprogram poate fi creat −

La nivelul schemei
În interiorul unui pachet

În interiorul unui bloc PL/SQL

La nivel de schemă, subprogramul este un subprogram autonom. Acesta este creat cu


CREAȚ I PROCEDURA sau declaraț ia CREAȚ I FUNCȚ IE. Este stocată în baza de date
ș i poate fi ș ters cu instrucț iunea DROP PROCEDURE sau DROP FUNCTION.
Un subprogram creat într-un pachet este un subprogram împachetat. Acesta este stocat în
bază de date ș i poate fi ș ters doar când pachetul este ș ters cu DROP
Declaraț ia PACKAGE. Vom discuta despre pachete în capitolul 'PL/SQL - Pachete'.
Subprogramele PL/SQL sunt blocuri PL/SQL numite care pot fi invocate cu un set de
parametrii. PL/SQL oferă două tipuri de subprograme -
Funcț ii - Aceste subprograme returnează o singură valoare; utilizate în principal pentru a calcula
ș i returnează o valoare.

Proceduri− Aceste subprograme nu returnează o valoare direct; sunt folosite în principal pentru
efectuează o acț iune.
ParteaunuisubprogramPL/SQL
Fiecare subprogram PL/SQL are un nume ș i poate avea, de asemenea, o listă de parametri. Ca
blocuri PL/SQL anonime, blocurile denumite vor avea de asemenea următoarele trei părț i -

Nr. crt. Parts & Description

Partea declarativă
Este o parte opț ională. Cu toate acestea, partea declarativă pentru un subprogram face
1 nu începe cu cuvântul cheie DECLARE. Con ț ine declara ț ii de tipuri,
cursori, constante, variabile, excepț ii ș i subprograme înn svoite. Aceste
elementele sunt locale subprogramului ș i încetează să existe atunci când subprogramul
finalizează execuț ia.

Partea Executabilă
2 Aceasta este o parte obligatorie ș i con ț ine declara ț ii care execută
acț iune desemnată.

Gestionarea excepț iilor


3 Aceasta este din nou o parte opț ională. Conț ine codul care gestionează timpul de execuț ie.
erori.

Crearea unei proceduri


O procedură este creată cu declaraț ia CREATE OR REPLACE PROCEDURE. The
sintaxa simplificată pentru instrucț iunea CREATE OR REPLACE PROCEDURE este următoarea −

CREAȚI[SA înlocuiți] PROCEDURA numel_procedurii

[(numele_parametrului[IN|OUT|IN OUT]tip[, ...])]

{SI|CA}

ÎNCEPE

<procedure_body>

ENDnumele_procedurii;
Unde,
numele-procedurii specifică numele procedurii.
[OR REPLACE] opț iunea permite modificarea unei proceduri existente.
Lista de parametri op ț ional con ț ine nume, mod ș i tipuri de
[Link]ă valoarea care va fi transmisă din exterior ș i OUT
reprezintă parametrul care va fi folosit pentru a returna o valoare în afara de
procedură.
corpul-procedurii conț ine partea executabilă.
Cuvântul cheie AS este folosit în locul cuvântului cheie IS pentru a crea un standalone.
procedură.
Executarea unei proceduri independente
O procedură autonomă poate fi apelată în două moduri -
Folosind cuvântul cheie EXECUTE

Apelarea numelui procedurii dintr-un bloc PL/SQL


Procedura de mai sus numită 'greetings' poate fi apelată cu cuvântul cheie EXECUTE ca

EXECUTARE procedură;

DeletingaStandaloneProcedure
O procedură independentă este ș tearsă cu instrucț iunea DROP PROCEDURE. Sintaxă
for deleting a procedure is
STERGE PROCEDURA nume-procedură;

Modurelideparametrun
îsubprogrameelPLS
/QL

Tabelul următor enumeră modurile de parametru în subprogramele PL/SQL

[Link] Modul de parametru ș i descriere

ÎN
Un parametru IN vă permite să transmiteț i o valoare subprogramului. Este numai pentru citire.
1
parametru. În cadrul subprogramului, un parametru IN acț ionează ca o constantă. Acesta
nu poate fi atribuită o valoare. Poț i transmite un constant, literă, iniț ializată
variabilă sau expresie ca parametru IN. De asemenea, o poț i iniț ializa la un
valoare implicită; cu toate acestea, în acel caz, este omisă din subprogram
apel. Este modul implicit de transmitere a parametrilor. Parametrii sunt transmiș i
prin referinț ă.

IEȘ IRE
Un parametru OUT returnează o valoare programului apelant. În interiorul
2 subprogram, un parameter OUT acț ionează ca o variabilă. Îi poț i schimba valoarea
ș i faceț i referire la valoare după ce a fost atribuită. Parametrul efectiv trebuie să
variabilă ș i este transmisă prin valoare.

IN OUT
Un parametru IN OUT trece o valoare iniț ială către un subprogram ș i returnează
o valoare actualizată apelantului. Poate fi atribuită o valoare ș i valoarea poate
3 a fi citit.

Parametrul actual corespunzător unui parametrului formal IN OUT trebuie să


fii o variabilă, nu o constantă sau o expresie. Parametrul formal trebuie să fie
s-a asignat o valoare. Parametrul efectiv este trecut prin valoare.

MethodsforPassingParameters

Parametrii actuali pot fi transmiș i în trei moduri

Notare poziț ională


Notaț ie numită
Notare mixtă

Notatia pozitionala
În notaț ia poziț ională, poț i apela procedura ca
findMin(a, b, c, d);

În notaț ia poziț ională, primul parametru efectiv este înlocuit cu primul parametru formal.
parametru; al doilea parametru actual este înlocuit cu al doilea parametru formal
parametru, ș i aș a mai departe. Aș a că, a este înlocuit cu x, b este înlocuit cu y, c este înlocuit cu
forma substitută forzanddis.
Notare Numată
În notarea denumită, parametrul actual este asociat cu parametrul formal
utilizând simbolul săgeată ( => ). Apelul procedurii va fi ca următorul -
findMin(x => a, y => b, z => c, m => d);

Notare mixtă
În nota ț ie mixtă, po ț i combina ambele nota ț ii în apelul de procedură; cu toate acestea,
notaț ia poziț ională ar trebui să precede notaț ia denumită.

Următoarea apelare este legală


gasesteMin(a, b, c, m => d);

However, this is not legal:


findMin(x => a, b, c, d);

Funcț ie:
O funcț ie este la fel ca o procedură, cu excepț ia faptului că returnează o valoare. Prin urmare,

toate discuț iile din capitolul anterior sunt adevărate ș i pentru funcț ii.
CreareauneiFuncț i
O funcț ie independentă este creată folosind instrucț iunea CREATE FUNCTION.
sintaxa simplificată pentru declaraț ia CREATE OR REPLACE PROCEDURE este următoarea–

CREAȚI [SAU ÎNLOCUIȚI] FUNCȚIA nume_funcție


[(nume_parametru [IN | OUT | IN OUT] tip [, ...])]
RETURN return_datatype
{ESTE | CA}
ÎNCEPE
< corp_funcție >
FINALIZA [numele_funcției];

Unde,

funcț ia-nume specifică numele funcț iei.


[OR REPLACE] opț iunea permite modificarea unei funcț ii existente.
The optional parameter list contains name, mode and types of the parameters.
IN reprezintă valoarea care va fi transmisă din exterior ș i OUT reprezintă
parametrul care va fi utilizat pentru a returna o valoare în afara procedurii.
Funcț ia trebuie să conț ină o instrucț iune de returnare.

Clauza RETURN specifică tipul de date pe care intenț ionaț i să-l returnaț i din
funcț ie.
corpul-funcț iei conț ine partea executabilă.
Cuvântul cheie AS este folosit în locul cuvântului cheie IS pentru a crea un standalone
funcț ie.

Apelareaunefiuncț i
În timp ce creezi o funcț ie, oferi o definiț ie a ceea ce trebuie să facă funcț ia. Pentru a folosi
o funcț ie, va trebui să apelati acea funcț ie pentru a efectua sarcina definită. Când un
programul apelează o funcț ie, controlul programului este transferat către funcț ia apelată.
O funcț ie apelată îndeplineș te sarcina definită ș i atunci când instruirea sa de returnare este executată
sau când se ajunge la ultima instrucț iune de final, returnează controlul programului înapoi la
programul principal.

Pentru a apela o funcț ie, trebuie pur ș i simplu să treci parametrii necesari împreună cu
numele funcț iei ș i dacă funcț ia returnează o valoare, atunci poț i stoca valoarea returnată
valoare.

Funcț iRecursivePL/SQL
Am văzut că un program sau subprogram poate apela un alt subprogram. Când un
apelul subprogramului la el însuș i este denumit apel recursiv ș i procesul este cunoscut
recursie

Chestionare:

1. Scrie o procedură pentru a afi ș a un mesaj de bun venit cu numele.


2. Scrie o procedură pentru a insera un utilizator nou în tabela emp.
3. Scrie ț i o func ț ie pentru a găsi minimul între două numere.
4. Scrie o procedură pentru a găsi pătratul unui număr dat.
5. Scrie o func ț ie pentru a găsi factorialul unui număr.
Iesire:

i. Scrie o procedură pentru a afiș a un mesaj de bun venit cu numele.

Interogare:

CREAȚI SAU REEMPLCAȚI PROCEDURA WELCOME_MSG(NUME_P IN VARCHAR2)


ESTE
ÎNCEPE
DBMS_OUTPUT.PUT_LINE('BUN VENIT '|| P_NAME);
SFÂRȘIT;

EXEC WELCOME_MSG ('HASNAIN');

ii. Scrieț i o procedură pentru a insera un nou utilizator în tabela emp.

Întrebare:

CREAȚI SAU ÎNLOCUIȚI PROCEDURA INSERTUSER (ID ÎN NUMĂR, ENAME ÎN VARCHAR2)


CA
ÎNCEPUT
INSERARE ÎN EMP(EMP_ID,NUME) VALORI(ID,ENAME);
SFÂRȘIT;

ÎNCEPE
INSERTUSER(&A,'&B');
RECORDURI INSERATE CU SUCCES
SFÂRȘIT;
iii. Scrie o funcț ie pentru a găsi minimum dintre două numere.

Interogare:

CREAȚI SAU RECONSTRUIȚI FUNCȚIA F2 (X ÎN NUMĂR, Y ÎN NUMĂR) ÎNAPOI


NUMĂRUL ESTE Z NUMĂR;
BEGIN
Dacă X<Y atunci Z:=X;
ALTFEL Z:=Y;
ÎNCHEIE IF;
ÎNTORCE Z;
ÎNCHEIAT;

DECLARA
C NUMĂR(8);
ÎNCEPE
C:=F2(20,30);
DBMS_OUTPUT.PUT_LINE('IEȘIRE ' || C);
SFÂRȘIT;

iv. Scrie o procedură pentru a găsi pătratul unui număr dat.

Interogare:

CREAȚI SAU ÎNLOCUIȚI PROCEDURA SQUARENUM(X ÎN EXTERN NUMĂR) AȘA CUM


ÎNCEPE
X := X * X;
SFÂRȘIT;

DECLAR
UN NUMĂR;
ÎNCEPE
A:= 23;
SQUARENUM(A);
DBMS_OUTPUT.PUT_LINE(' PATRATUL LUI (23): ' || A);
SFÂRȘIT;
v. Scrieț i o funcț ie pentru a găsi factorialul unui număr.

Interogare:

CREAȚI SAU ÎNLOCUIȚI FUNCȚIA FACT(N NUMĂ) ÎNAPOI NUMĂ ESTE


NUMĂR(3);
F NUMBER:=1;
ÎNCEPE
PENTRU I ÎN 1..N
CICLU
F:=F*I;
SFÂRȘITUL CICLULUI;

ÎNTORCE(F);
ÎNCHEI FAPTUL;

DECLARA
F NUMĂR(3);
N NUMĂR(3):=&N;
ÎNCEPE
F:=FACT(N);
DBMS_OUTPUT.PUT_LINE('FACTORIAL= ' || F);
FINAL;
Experimentul 12

Date:

Obiectiv:
Pentru a implementa conceptul de declanș atoare.

Software Used:
Oracle 12c

Teorie:
Declanș atoarele sunt programe stocate, care sunt executate sau activate automat când anumite
evenimentele au loc. Declanș atoarele sunt, de fapt, scrise pentru a fi executate ca răspuns la oricare dintre
evenimentele următoare −

O declaraț ie de manipulare a bazei de date (DML) (Ș TERGE, INSERARE sau ACTUALIZARE)

O declaraț ie de definiț ie a bazei de date (DDL) (CREATE, ALTER sau DROP).

O operaț iune de bază de date (EROARE SERVER, CONECTARE, DECONECTARE, ÎNCEPUT)

sau SHUTDOWN).
Declanș atoarele pot fi definite pe tabel, vedere, schemă sau bază de date cu care evenimentul.
este asociat.

Beneficiile declanș atoarelor

Declanș atoarele pot fi scrise pentru următoarele scopuri −

Generarea automată a unor valori derivate pentru coloane


Aplicarea integrităț ii referenț iale
Jurnalizarea evenimentelor ș i stocarea informaț iilor despre accesul la tabele

Audit
Replicarea sincronă a tabelelor
Impunerea autorizaț iilor de securitate
Prevenirea tranzacț iilor invalide
CreareaDecalnșatoareolr

Sintaxa pentru crearea unui trigger este −

CREAȚI[SA SCHIMBAȚI]TRIGGER nume_trigger

{ÎNAINTE|DUPĂ|ÎN LOCUL}

{INSERARE[SAU] |ACTUALIZARE[SAU] |STERGERE}

[OF col_name]

PE numele_tabelului

[REFERINȚA VECHILOR CA O NOUĂ CA N]

[PENTRU FIECARE RÂND]

CÂND(condiție)

DECLAR

Declarații-statements

ÎNCEPE

Declarații executabile

EXCEPȚIE

Declarații de gestionare a excepțiilor

SFÂRȘIT;

Unde,
CREAȚ I [SAU RECOMPENSAȚ I] TRIGGER nume_trigger − Creează sau înlocuieș te un existent
trigger cu numele_trigger.
{ÎNAINTE DE | DUPĂ | ÎN LOC DE} − Acest lucru specifică când va fi declanș atorul
executat. Clauza INSTEAD OF este folosită pentru a crea un trigger pe o vedere.

{INSERARE [SAU] | UPDATE [SAU] | Ș TERGERE} − Aceasta specifică operaț iunea DML.

[OF col_name] - Aceasta specifică numele coloanei care va fi actualizată.

[PE table_name] - Aceasta specifică numele tabelului asociat cu


declanș ator.
[REFERIND LA VECHI CA o NOU CA n] − Acest lucru vă permite să faceț i referire la nou ș i vechi

valori pentru diverse declaraț ii DML, cum ar fi INSERT, UPDATE ș i DELETE.


[PENTRU FIECARE RÂND] - Aceasta specifică un trigger la nivel de rând, adică, triggerul va fi
executat pentru fiecare rând afectat. Altfel, triggerul se va executa doar
odată ce instrucț iunea SQL este executată, ceea ce se numeș te un declanș ator la nivel de tabel.

CAND (condiț ie) - Aceasta oferă o condiț ie pentru rândurile pentru care declanș atorul
ar încălca. Această clauză este valabilă doar pentru declanș atoare la nivel de rând.

Example
Pentru început, vom folosi tabelul CUSTOMERS pe care l-am creat ș i utilizat în
capitolele anterioare −

Selectați * din clienți;

+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP 4500.00
+----+----------+-----+-----------+----------+

Următorul program creează un trigger la nivel de rând pentru tabelul clienț i care ar
declanș ează pentru operaț iunile INSERT sau UPDATE sau DELETE efectuate pe tabela CLIENTI.
Acest trigger va afiș a diferenț a de salariu între valorile vechi ș i valorile noi

CREAȚI SAU ÎNLOCUIȚI TRIGGER-ul display_salary_changes

ÎNAINTE DE ȘTERGERE SAU INSERARE SAU ACTUALIZARE PE clienți

PENTRU FIECARE LINIE

CAND([Link]>0)

DECLARA

sal_diff number;

ÎNCEPE

sal_diff:= :[Link]- :[Link];

dbms_output.put_line('Salariul vechi: '|| :[Link]);

dbms_output.put_line('Salariul nou: '|| :[Link]);

dbms_output.put_line('Diferența de salariu: '||sal_diff);

SFÂRȘIT;

/
Când codul de mai sus este executat la promptul SQL, acesta produce următorul rezultat-
Declanșator creat.

Următoarele puncte trebuie luate în considerare aici -


Referinț ele VECHE ș i NOI nu sunt disponibile pentru trigerii la nivel de tabel, ci mai degrabă tu
poț i să le foloseș ti pentru declanș atoare la nivel de înregistrare.

Dacă doriț i să interogaț i tabela în acelaș i declanș ator, atunci ar trebui să folosiț i
după cuvântul cheie, deoarece declanș atoarele pot interoga tabela sau o pot schimba din nou doar
după ce modificările iniț iale sunt aplicate ș i tabelul este readus într-o stare consistentă.

Declanș atorul de mai sus a fost scris în aș a fel încât să se declanș eze înainte de orice
Ș tergeț i sau inseraț i sau actualizaț i operaț iunea pe tabel, dar puteț i scrie propriul dvs.
declanș ează pe o singură sau mai multe operaț iuni, de exemplu ÎNAINTE DE Ș TERGERE, care
se va declanș a de fiecare dată când un fiș ier va fi ș ters folosind operaț iunea DELETE pe
masă.

TriggeringaTrigger
Să efectuăm câteva operaț iuni DML pe tabela CUSTOMERS. Iată un INSERT
declaraț ie, care va crea un nou record în tabel −

INSERARE ÎN CLIENȚI(IDENTIFICATOR,NUME, VÂRSTĂ,ADRESĂ, SALARIU)

VALUES(7,'Kriti',22,'HP',7500.00);

Când un înregistrare este creată în tabela CLIENTI, crea ț i mai sus


declanș atorul, modificările_salariale_vor_fi_declanș ate_iar_acesta_vor_affiș a_următorul_rezultat−

Old salary:
Salariul nou: 7500
Salary difference:

Pentru că acesta este un nou record, salariul vechi nu este disponibil ș i rezultatul de mai sus apare ca
nul. Să efectuăm acum o altă operaț iune DML pe tabela CLIENTI.
Declaraț ia UPDATE va actualiza un apel existent în tabel -

UPDATE clienți

SET salariu=salariu+500

UNDE id=2;
Când un înregistrare este actualizată în tabela CUMPĂRĂTORI, crea ț i mai sus
declanș atorul, display_salary_changes va fi activat ș i va afiș a următorul rezultat–

Salariul vechi: 1500


Salariul nou: 2000
Salary difference: 500
Experiment deschis
Optimizarea interogărilor (RA)

Date:10-10-2018

Obiectiv:
Pentru a optimiza interogările SQL în cel mai bun mod posibil, astfel încât să necesite
cantitatea minimă de operaț ii ș i, prin urmare, de spaț iu.

Customer (C_ID, C_NAME,C_SECTOR C_ClTY)


Branch (B_ID, B_NAME, B_CITY)
Account (AN, BALANCE, B_ID)
Depositor (C_ID, AN)
Loan (LN, AMOUNT, B_ID)
Borrower (C_ID, LN)

Determinaț i numele clienț ilor care au atât cont cât ș i


împrumut de la bancă.

1. Select c_name din customerl unde cid în (Select c_id din depositor
INTERSECT select cid from borrower);

i. Selectaț i numele C din Client


Unde C_ID ÎN { SelectC_ID din Depozitar
INTERSECT
Select C_ ID from Borrower)

Răspuns: Temperatura{ C_ID(Depozitar) C_ID(Împrumutat)

C_NAME (Client Temp)

2.Selectc_nume din client1 unde cid in (Select cid din depunător unde cid
(Selectează cid din împrumutător);

ii. Selectaț i C_NAME din Client


Unde C_ID ÎN (Selectaț i C_ID din Depozitar)
Unde C_IDIN (SelectC_ID din Împrumutător

Răsp:Temp C_ID (Depozitant) C_ID (Împrumutat)

C_Name (Client Temp)


$IL D L GDWD
FRPHQ]LL
vQ IRUPDWXO
¶]]OODD´GH H[HPSOX¶IHE´

6(/(&7 72B&+$56<6'$7( ''00<<


',1 '8$/

*VH WHGDWD]LOHGXSGDW

6(/(&7 6<6'$7( 0<'$7( )520 '8$/

S-ar putea să vă placă și