Sunteți pe pagina 1din 17

Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM

Aplicatie Curs – Lect.univ.dr. Ionel Iacob

APLICAŢIE INFORMATICĂ PENTRU EVIDENȚA COMERCIALĂ DIN


CADRUL UNEI SOCIETĂŢI

1. CREAREA TABELELOR BAZEI DE DATE

Observație: Fiecare tabelă/obiect nou creat se va personaliza prin adăugarea


inițialelor masterandului la denumirea obiectului !

CLEAR SCREEN
PROMPT CREARE TABELA SITUATIE
DROP TABLE Situatie;
CREATE TABLE Situatie
( DenC Varchar2 (30),
TotalCom Number (3),
TotalVal Number (12) );
DESCRIBE Situatie;

PROMPT CREARE TABELA CLIENTI


DROP TABLE Clienti;
CREATE TABLE Clienti
( CodC Number (3),
DenC Varchar2 (30),
Loc Varchar2 (30) );
DESCRIBE Clienti;

1
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

PROMPT CREARE TABELA COMENZI


DROP TABLE Comenzi;
CREATE TABLE Comenzi
( CodC Number (3),
NrCom Number (5),
Val Number (9) );
DESCRIBE Comenzi;

PROMPT CREARE TABELA RESTANTE


DROP TABLE Restante;
CREATE TABLE Restante
( CodClient Number (3),
SumaPlatita Number (9),
TotalSuma Number (9) );
DESCRIBE Restante;

PROMPT CREARE TABELA CADRE


DROP TABLE Cadre;
CREATE TABLE Cadre
( Nume Varchar2 (30),
DataAng Date,
DataPlata Date Constraint nll_data NULL,
Salariu Number (9) );
DESCRIBE Cadre;

2
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

PROMPT CREARE TABELA SITUATIE_SAL


DROP TABLE SituatieSal;
CREATE TABLE SituatieSal
( Nume Varchar2 (30),
Sal_Init Number (9),
Sal_Index Number (9),
Suma_Index Number (9) );
DESCRIBE SituatieSal;

PROMPT TABELA CREARE TABELA SALARIU


DROP TABLE Salariu;
CREATE TABLE Salariu
( Nume Varchar2 (30),
Salariu Number (9) );
DESCRIBE Salariu;

INSERAREA DATELOR
PROMPT INTRODUCERE DATE ÎN TABELA CLIENŢI
DELETE FROM Clienti;
INSERT INTO Clienti VALUES(1,'Client 1', 'Bucuresti');
INSERT INTO Clienti VALUES(2,'Client 2', 'Bucuresti');
INSERT INTO Clienti VALUES(3,'Client 3', 'Timisoara');
INSERT INTO Clienti VALUES(4,'Client 4','Cluj');
INSERT INTO Clienti VALUES(5,'Client 5','Brasov');
INSERT INTO Clienti VALUES(6,'Client 6','Iasi');

3
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

INSERT INTO Clienti VALUES (7,'Client 7','Cluj');


INSERT INTO Clienti VALUES (8,'Client 8', 'Timisoara');
SELECT * FROM Clienti;

PROMPT INTRODUCERE DATE ÎN TABELA COMENZI


DELETE FROM Comenzi;
INSERT INTO Comenzi VALUES (1,1,1000);
INSERT INTO Comenzi VALUES (1,2,2000);
INSERT INTO Comenzi VALUES (1,3,3000);
INSERT INTO Comenzi VALUES (2,4,4000);
INSERT INTO Comenzi VALUES (2,5,5000);
INSERT INTO Comenzi VALUES (3,6,6000);
INSERT INTO Comenzi VALUES (3,7,7000);
INSERT INTO Comenzi VALUES (3,8,8000);
INSERT INTO Comenzi VALUES (3,9,9000);
INSERT INTO Comenzi VALUES (4,10,1500);
INSERT INTO Comenzi VALUES (5,11,2500);
INSERT INTO Comenzi VALUES (5,12,3500);
INSERT INTO Comenzi VALUES (6,13,4500);
INSERT INTO Comenzi VALUES (8,14,5500);
INSERT INTO Comenzi VALUES (8,15,6500);
SELECT * FROM Comenzi;

INTRODUCERE DATE ÎN TABELA RESTANŢE


DELETE FROM Restante;

4
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

INSERT INTO Restante VALUES (1, 1000, 100);


INSERT INTO Restante VALUES (2, 2500, 3400);
INSERT INTO Restante VALUES (3, 3200, 1600);
INSERT INTO Restante VALUES (4, 5400, 3500);
INSERT INTO Restante VALUES (5, 7600, 9300);
INSERT INTO Restante VALUES (6, 8900, 8900);
SELECT * FROM Restante;

PROMPT INTRODUCERE DATE ÎN TABELA CADRE


DELETE FROM Cadre;
INSERT INTO Cadre VALUES ('Costin George',
TO_DATE ('16-05-2000','dd-mm-yyyy'), NULL, 2300;
INSERT INTO Cadre VALUES ('Leontin Marian',
TO_DATE ('14-03-2002','dd-mm-yyyy'), NULL, 2800);
INSERT INTO Cadre VALUES ('Stoica Maria',
TO_DATE ('28-08-2003','dd-mm-yyyy'), NULL, 3500);
INSERT INTO Cadre VALUES ('Tudor Adrian',
TO_DATE ('03-10-2001','dd-mm-yyyy'), NULL, 2600);
SELECT * FROM Cadre;

Să se introducă denumirea unei localităţi de la tastatură şi să se extragă un


subşir, corespunzător numărului de poziţii seletate, de la un caracter dat.
SET VERIFY OFF;
ACCEPT Sir PROMPT 'Introduceti un sir de caractere oarecare: ';
ACCEPT Start PROMPT 'Pozitia de la care se incepe substragerea: ';

5
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

ACCEPT Stop PROMPT 'Cate caractere se substrag: ;


SELECT SUBSTR ('&Sir',&Start,&Stop) "Rezultat" FROM DUAL;

Pentru o Comandă de produse selectată de la tastatură, să se actualizeze


valoarea comenzii cu noul număr introdus.
SELECT NrCom, Val FROM Comenzi;
ACCEPT NrComanda PROMPT 'Dati nr comenzii: '
ACCEPT ValComanda PROMPT ' Noua valoare a comenzii :'
SELECT NrCom AS "Nr comanda", val AS "valoare"
FROM Comenzi WHERE NrCom=&NrComanda;
UPDATE Comenzi SET Val=&ValComanda
WHERE NrCom=&NrComanda;
SELECT NrCom AS "Nr comanda", val AS "Valoare noua"
FROM Comenzi WHERE NrCom=&NrComanda;

3. DEFINIREA CURSOARELOR
Pentru o localitate introdusă de la tastatură, se vor selecta numele
clienţilor din localitatea respectivă. Rezultatul acestei proiecţii se va stoca
în câmpul „Nume” dintr-o tabelă „Mesaje” nou creată.
DROP TABLE Mesaje;
CREATE TABLE Mesaje (Nume Varchar2 (30) );
SELECT * FROM Clienti;
ACCEPT Loc PROMPT 'Introduceti localitatea din care se va selecta clientul:'

6
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

DECLARE
Nume Clienti.DenC%TYPE;
CURSOR c1 (Localitate varchar2) IS
SELECT DenC FROM Clienti WHERE Loc = Localitate;
BEGIN
OPEN c1 ('&Loc');
LOOP
FETCH c1 INTO Nume;
EXIT WHEN c1%NOTFOUND;
INSERT INTO Mesaje VALUES(Nume);
END LOOP;
CLOSE c1;
END;
/
SELECT * FROM Mesaje;

Să se definească un program PL/SQL care să permită stabilirea situaţiei


unui client (Achitat/Dator), în funcţie de plăţile efectuate şi suma datorată.
DROP TABLE SitPlati;
CREATE TABLE SitPlati
( CodClient Number (3),
Situatie Varchar2 (15),
Debit Number (9),
Credit Number (9) );

7
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

DECLARE
CURSOR c1 IS SELECT * FROM Restante;
BEGIN
FOR i IN c1
LOOP
IF i.SumaPlatita=i.TotalSuma THEN
INSERT INTO SitPlati VALUES (i.CodClient, 'Achitat',0,0);
END IF;
IF i.SumaPlatita<i.TotalSuma THEN
INSERT INTO SitPlati VALUES
(i.CodClient, 'dator', 0, i.TotalSuma-i.SumaPlatita);
END IF;
IF i.SumaPlatita>i.TotalSuma THEN
INSERT INTO SitPlati VALUES
( i.CodClient, 'Debitor', i.SumaPlatita-i.TotalSuma,0);
END IF;
END LOOP;
END;
/
SELECT * FROM Restante;
SELECT * FROM SitPlati;

8
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

Să se definească un program PL/SQL care să selecteze clienţii restanţieri,


în funcţie de o anumită valoare introdusă pentru procentul de restanţă.
DROP TABLE Temp;
CREATE TABLE Temp
( CodClient Number (3),
Restanta Number (9),
Procent Number (3) );
ACCEPT Proc PROMPT 'Procentul de la care se selecteaza restantele: ';
DECLARE
CURSOR c1 IS
SELECT * FROM Restante;
SumaRestanta Number (9);
ProcentRestanta Number (3);
BEGIN
FOR i IN c1 LOOP
IF i.SumaPlatita<i.TotalSuma THEN
SumaRestanta:=i.TotalSuma-i.SumaPlatita;
IF SumaRestanta>=(i.TotalSuma*(&proc))/100
THEN
ProcentRestanta:= 100- ((i.SumaPlatita*100)/i.TotalSuma);
INSERT INTO Temp VALUES
( i. CodClient, SumaRestanta, ProcentRestanta);
END IF;
END IF;

9
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

END LOOP;
END;
/
SELECT * FROM Temp ORDER BY Procent;

Faţă de data curentă, să se afişeze următoarea zi de Vineri (FRIDAY)


corespunzătoare zilei de plată.
PROMPT 'SE SCHIMBA SISTEMUL DE AFISARE A DATEI
IN FORMATUL ZI-LUNA-AN: '
ALTER SESSION SET NLS_DATE_FORMAT = 'dd-mm-yyyy';
DECLARE
CURSOR c1 IS
SELECT * FROM Cadre;
ZiAng Varchar2 (2);
DataPlataLuna Date;
BEGIN
FOR i IN c1
LOOP
SELECT TO_CHAR(i.DataAng, 'dd') INTO ZiAng FROM DUAL;
IF ZiAng<=15 THEN
SELECT NEXT_DAY (LAST_DAY (SYSDATE)-7, 'Friday')
INTO DataPlataLuna FROM DUAL;
END IF;

10
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

IF ZiAng>15 THEN
SELECT NEXT_DAY (LAST_DAY( ADD_MONTHS (SYSDATE,1) )-7,
'Friday') INTO DataPlataLuna FROM DUAL;
END IF;
UPDATE Cadre SET DataPlata=DataPlataLuna
WHERE Nume=i.Nume;
END LOOP;
END;
/
SELECT * FROM Cadre ORDER BY DataAng;

Observaţie:
 Funcţia LAST_DAY(DATA, 'NumeZi) selectează ultima zi din lună,
identificată prin „NumeZi”.
 Funcţia ADD_MONTHS (DATA, Nr_Luni) adaugă la „Data” un anumit
număr de luni.
 Funcţia NEXT_DAY(LAST_DAY(SYSDATE)-7,'Friday’) afişează ultima zi
de Vineri din luna curentă.
 Funcţia NEXT_DAY (LAST_DAY (ADD_MONTHS (SYSDATE,1))-7,
'Friday’) afişeaza ultima zi de Vineri din luna următoare, faţă de data curentă.

11
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

Să se definească un program PL/SQL care să permită realizarea unor


indexări cu 10 procente pentru salariaţi, doar dacă suma salariilor –
totalizată pentru întreaga unitate – nu depăşeşte o limită de buget, definită
explicit de utilizator. În caz contrar, se va defini o eroare care să
menţioneze neindexarea.
PROMPT Stabilire indexari salariale;
DELETE FROM SituatieSal;
ACCEPT LimitaBuget PROMPT 'Limita de buget pentru indexare: ';
DECLARE
CURSOR c1 IS
SELECT *FROM Cadre ORDER BY Salariu;
ZiAng Varchar2 (2);
DataPlataLuna Date;
TotalSuma Number (12):=0;
BEGIN
FOR i IN c1 LOOP
TotalSuma:=TotalSuma+ i.Salariu;
IF TotalSuma<&LimitaBuget THEN
INSERT INTO SituatieSal VALUES
(i.Nume,i.Salariu,((i.Salariu*110)/100), ((i.Salariu*110)/100)-i.Salariu);
UPDATE Cadre
SET Salariu=((i.Salariu*110)/100) WHERE Nume=i.Nume;
END IF;

12
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

IF TotalSuma>&LimitaBuget THEN
RAISE_APPLICATION_ERROR (-20001, 'Eroare -
salarii foarte mari, nu se mai face nici o indexare');
EXIT;
END IF;
END LOOP;
END;
/
SELECT Nume,
Sal_Init AS "SALARIU_INITIAL",
Sal_Index AS "SALARIU_INDEXAT",
Suma_Index AS "SUMA_INDEXATA"
FROM SituatieSal ORDER BY Nume;
SELECT COUNT(*) "INDEXARI" FROM SituatieSal;

Observaţie:
 deoarece este vorba de realizarea unei sume, variabila TotalSumă, declarată de tip
Numeric, se iniţializează cu 0;
o această variabilă stochează suma tuturor salariilor la nivelul unităţii şi
reprezintă un criteriu de condiţionare alături de variabila LimitaBuget;
 funcţia: RAlSE_APPLlCATlON_ERROR (-20001, 'Eroare - salarii foarte mari,
nu se mai face nicio indexare') – EXIT:
o permite definirea unei erori explicite de către utilizator în cazul în care
suma salariilor depaşeşte nivelul fixat de variabila LimitaBuget;

13
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

Ca procedeu de execuţie, se execută paşii următori:


o programul citeşte salariul primului angajat, efectuează indexarea şi
verifică suma tuturor salariilor;
o dacă suma rezultată în urma indexării anterioare se încadrează într-un
nivel stabilit (şi specificat explicit de utilizator în variabila LimitaBuget),
se reia procedura de indexare până la ultimul angajat;
o dacă la final, după ultimul salariu indexat, suma tuturor drepturilor
salariale nu depăşeşte limita de buget, atunci ca rezultat vor fi afişate
salariile indexate şi suma corespunzătoare indexării efectuate pentru
fiecare salariat;
o în caz contar, la o singură depăşire a bugetului printr-o indexare, se
anulează întreg procesul şi se defineşte eroarea "Raise_Application_Error
(-20001)".
 deoarece programul insereaza automat salariile mărite, la fiecare indexare, în
tabela Cadre, se vor vedea modificări (alte salarii de baza şi alte sume de
indexare) pentru fiecare execuţie a programului;
 pentru păstrarea valorilor iniţiale afişate de program, se recomandă ştergerea
tuplurilor din tabela Cadre, şi reinserarea lor execuţia ulterioară a indexării.

Să se afişeze valorile medii, minime și maxime ale salariilor pe unitate


corespunzătoare salariilor de încadrare din tabela Cadre. Datele se vor
stoca într-o nouă tabelă Valori.
CREATE TABLE Valori
( NrInreg Number (3), Medie Number (5),
Minim Number (5), Maxim Number (7) );

14
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

DECLARE
NNrInreg Number (3);
NSalariu_med Cadre.Salariu %TYPE;
NSalariu_min Cadre.Salariu %TYPE;
NSalariu_max Cadre.Salariu %TYPE;
BEGIN
SELECT COUNT (Nume) INTO NNrInreg FROM Cadre;
SELECT AVG (Salariu) INTO NSalariu_med FROM Cadre;
SELECT MIN (Salariu) INTO NSalariu_min FROM Cadre;
SELECT MAX (Salariu) INTO NSalariu_max FROM Cadre;
INSERT INTO Valori VALUES
(NNrInreg, NSalariu_med, NSalariu_min, NSalariu_max);
END;
/
SELECT * FROM Valori;

Să se definească o tabelă nouă AUTO care să permită modificarea


capacităţii cilindrice a unui autovehicol, în funcţie de numărul
autovehicolului introdus şi noua capacitate ce se doreşte a se modifica.
Totodată, se va crea şi tabela Mesaj care să stocheze eventualele Mesaje de
atenţionare dacă maşina nu a fost găsită.
DROP TABLE Auto;
CREATE TABLE Auto
( NrAuto Varchar2 (9),
Tip Varchar2 (30),

15
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

Serie Varchar2 (20),


Capacitate Number (4) );
DROP TABLE Mesaj;
CREATE TABLE Mesaj (Mesaj Varchar2 (30) );
INSERT INTO Auto VALUES
('B-13-MIR','Dacia Supernova,'SN B7rr42dwe',1600);
INSERT INTO Auto VALUES
('B-02-MVI',’FORD FOCUS GHIA’,’WF0wxxgcd',1600);
INSERT INTO Auto VALUES
('B-05-NHV','Audi','V B2rtu42dwe',2700);
INSERT INTO Auto VALUES
('MS-63-QPU','BMW','BMW B57rr42dz6',3500);
PROMPT Tabela auto initiala;
SELECT * FROM Auto;
ACCEPT NNrAuto PROMPT ‘Introduceti numarul masinii: ‘ ;
ACCEPT NCap PROMPT ‘Introduceti noua capacitate: ‘ ;
DECLARE
NNrauto Auto.NrAuto%TYPE;
NCap Auto.Capacitate%TYPE;
BEGIN
UPDATE Auto
SET Capacitate=&Ncap WHERE NrAuto='&NNrAuto';
IF SQL%NOTFOUND THEN
INSERT INTO Mesaj VALUES ('Masina nu a fost gasita');

16
Masterat: Dezvoltare Aplicatii cu baze de date Oracle – Anul I, IEM
Aplicatie Curs – Lect.univ.dr. Ionel Iacob

END IF;
END;
/
PROMPT 'Mesaj de atentionare (daca exista):'
SELECT * FROM Mesaj;
PROMPT 'Tabela auto modificata in functie de capacitate:'
SELECT Nrauto, Capacitate FROM Auto where NrAuto='&NNrAuto';

17

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