Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
VARIABILE 1. Declarare şi iniţializare
declararea variabilelor se realizează în zona declarativă (delimitată prin DECLARE) a blocului (sau sub-blocului); iniţializarea se poate face la declarare sau în zona de execuţie (între BEGIN şi END); variabilele vor fi vizibile în restul blocului, respectiv şi în blocurile incluse în el, mai puţin în sub-blocurile în care numele lor este redefinit (ca în majoritatea limbajelor de programare structurate, semnificaţia unui nume definit de utilizator într-un bloc/sub-bloc este dată de cea mai apropiată declaraţie anterioară locului folosirii); toate variabilele PL/SQL au un tip de dată, restricţii şi un şir valid de valori; declararea şi iniţializarea se realizează astfel:
nume_variabila [CONSTANT] TIP_DATA [NOT NULL] [:= | DEFAULT expresie]
constantele trebuie obligatoriu iniţializate, iar ulterior nu îşi vor putea schimba valoarea; variabilele NOT NULL trebuie obligatoriu iniţializate, iar ulterior nu vor putea primi valoarea NULL; se foloseşte următoarea convenţie de notare: c_nume Constanta v_nume Variabila g_nume VarGlobala (variabilă globală definită în zona de specificaţii a pachetului de programe şi valabilă pentru toate subprogramele pachetului).
2. Tipuri de variabile Variabile PL/SQL Scalare Compozite Referinţă LOB (Large Objects): NCLOB, CLOB, BLOB, BFILE Obiect Variabile non-PL/SQL: variabile de mediu (BIND VARIABLES) a) Variabile Scalare: Tipurile scalare conţin valori simple (o variabila scalară poate conţine la un moment dat o singură valoare simplă) şi corespund în principal tipurilor pe care le pot avea coloanele tabelelor.
char (lung_max) - lungime fixă de max 32.767 bytes varchar2 (lung_max) – lungime variabilă de max 32.767 bytes long [şir de caractere de lungime variabilă 2GB] number (precizie,scală) boolean (true, false, null) 1
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
date binary_integer şi pls_integer (numere întregi între -2147483647 şi 2147483647) binary_float şi binary_double (pentru numere reale în varianta Oracle 10g) timestamp (pentru fracţiuni de secundă)
Exemple: v_functie varchar2(9); v_numar binary_integer:=0; v_totalsal number(9,2):=0; v_datainceput date:=sysdate+7; c_taxa constant number(3,2):=8.25; v_valid boolean not null:=true; Afişarea variabilelor PL/SQL se realizează prin intermediul funcţiei PUT_LINE din pachetului DBMS_OUTPUT. Se poate utiliza operatorul de concatenare ( || ) pentru a afişa mai multe mesaje sau variabile pe aceeaşi linie.
DBMS_OUTPUT.PUT_LINE ('VALOAREA VARIABILEI ESTE:' ||variabila);
Popularea variabilelor cu valori din tabelele bazei de date Se utilizează comanda SELECT cu clauza INTO pentru popularea variabilelor PL/SQL cu valori ale atributelor din tabele; Sa se afiseze salariul angajatului cu id-ul 100.
set serveroutput on DECLARE v_salariu number(5); BEGIN SELECT salariul INTO v_salariu FROM angajati WHERE id_angajat=100; DBMS_OUTPUT.PUT_LINE('Salariul angajatului cu id-ul 100 este='||v_salariu); END; / Exemplu: --se afiseaza numele angajatului cu codul 100 SET SERVEROUTPUT ON DECLARE v_nume VARCHAR2(20); BEGIN SELECT nume INTO v_nume 2
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
FROM angajati WHERE id_angajat = 100; DBMS_OUTPUT.PUT_LINE('NUMELE ANGAJATULUI ESTE:' || v_nume); END; /
cererile SELECT din cadrul blocurilor PL/SQL trebuie să furnizeze rezultat (în caz contrar se semnalează eroare).
o singură linie
Exemplu: Sa se afiseze numele angajatului care are functia 'IT_PROG'.
set serveroutput on DECLARE v_angajat varchar2(25); BEGIN --sunt mai multi angajati cu functia de IT_PROG
SELECT nume INTO v_angajat FROM angajati WHERE id_functie=upper('IT_PROG'); --upper inseamna ca regaseste acele cuvinte scrise cu litere de tipar, pt ca SQL nu face diferenta intre ele
DBMS_OUTPUT.PUT_LINE('Numele angajatului care are functia IT_PROG este '||v_angajat); END; /
Ne da eroare pt ca sunt mai multe tupluri care au aceeeasi functie. 3. Atributul %TYPE
Atribuie unei variabile tipul altei variabile sau tipul de date specific unei coloane din tabelă. Declararea unei variabile cu %TYPE: variabila sau variabila1 variabila2
tabelă.nume_coloană%TYPE; tip_dată; variabila1%TYPE;
Exemplu: 3
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
--afiseaza numele si prenumele angajatului cu codul 100. DECLARE v_nume angajati.nume%TYPE; v_prenume angajati.prenume%TYPE; BEGIN SELECT nume, prenume INTO v_nume, v_prenume FROM angajati WHERE id_angajat = 100; DBMS_OUTPUT.PUT_LINE('NUMELE ANGAJATULUI ESTE:' || v_nume||' '|| v_prenume); END; / Observaţie: Restricţia NOT NULL a unei coloane nu se aplică şi variabilei declarate prin folosirea atributului %TYPE. 4. Variabile de mediu sau variabile de legătură ale aplicaţiilor gazdă (BIND VARIABLES)
sunt variabile de legătură cu aplicaţia în care rulează motorul PL/SQL; trebuie declarate în aplicaţie (în mediul gazdă) şi pot fi accesate şi modificate în cadrul blocurilor PL/SQL; după terminarea execuţiei blocului PL/SQL, variabila rămâne în mediul gazdă cu valoarea primită în urma rulării blocului (şi poate fi pasată altui bloc, realizând astfel transmiterea de valori între blocurile PL/SQL); nu pot fi utilizate în cadrul procedurilor, funcţiilor sau pachetelor; se declară în afara blocului PL/SQL cu ajutorul cuvântului cheie VARIABLE:
VARIABLE g_numevariabilă TIP
pentru declararea unei variabile host de tip NUMBER nu se specifică precizia şi scala; pentru utilizarea lor în cadrul unui bloc PL/SQL sau într-o frază SQL din afara blocului se prefixează cu “:”
:host_variabila:=v_variabila;
se afişează în afara blocului cu ajutorul comenzii PRINT (la afişare variabila nu se va prefixa cu “:”)
PRINT g_numevariabilă Exemple: --se afişează mesajul: Bloc PL/SQL VARIABLE g_mesaj varchar2(30) BEGIN :g_mesaj:='Bloc PL/SQL'; END; / PRINT g_mesaj 4
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
SET SERVEROUTPUT ON VARIABLE g_comenzi varchar2(30)
BEGIN select count(*) into :g_comenzi from comenzi where modalitate = 'online'; END; / PRINT g_comenzi Exemplu: Sa se afiseze mesajul "Ana are mere" --se foloseste o variabila de mediu(variabila de legatura) --o declaram in afara blocului PL/SQL
set serveroutput on VARIABLE g_mesaj varchar2(30) BEGIN --pentru a utiliza aceasta variabila de mediu declarata in afara blocului trebuie sa prefixam cu ":"
:g_mesaj:='Ana are mere'; END; / --pentru a afisa aceasta variabila de mediu folosim comanda PRINT in afara blocului
PRINT g_mesaj
Sa se afiseze mesajul "Mi-e foarte somn"
set serveroutput on --declaram variabila in care stocam mesajul, este mereu in afara blocului
VARIABLE g_mesaj varchar2(30) BEGIN --in interiorul blocului trebuie sa prefixam cu : numele variabilei pentru a putea fi accesata
:g_mesaj:='Mi-e foarte somn'; END; /
5
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
Observaţie: Se poate auto-afişa variabila prin setarea AUTOPRINT ON Exemplu: --se selecteaza produsele si pretul acestora pentru acele produse care au pretul < pretul mediu al produsului cu codul 3133 fara a utiliza un select imbricat SET SERVEROUTPUT ON SET AUTOPRINT ON VARIABLE g_pret number BEGIN select avg(pret) into :g_pret from rand_comenzi where id_produs = 3133; END; / select * from rand_comenzi where pret< :g_pret; 5. Variabile de substituţie
de regulă, variabilele de substituţie sunt folosite pentru a transmite valori dinspre mediul SQL*Plus spre comenzile SQL sau blocurile PL/SQL, în timp ce variabilele de legătură (bind variables) sunt folosite pentru a transmite valori în sens invers sau pentru a transfera valori între blocuri PL/SQL lansate succesiv (primul bloc setează variabila, următorul o consultă); prin variabile de substituţie se pot transmite valori comenzilor SQL sau blocurilor PL/SQL lansate (folosind "&" sau "&&"); se pot invoca din comenzile SQL sau din blocurile PL/SQL prin "&nume_variabila" sau "&&nume_variabila"; sunt locale sesiunii SQL în care au fost declarate; în mediul SQL variabilele de substituţie pot fi uşor citite prin introducerea de valori de la tastatură (utilizând ACCEPT), se pot defini (cu DEFINE) sau afişa pe ecran (cu PROMPT);
Exemple: --se afiseaza numarul de comenzi ale angajatului al carui cod este introdus de utilizator prin intermediul variabilei de substitutie &id_angajat DECLARE v_nr_comenzi number(2); BEGIN select count(nr_comanda) into v_nr_comenzi from comenzi where id_angajat=&id_angajat; dbms_output.put_line('Angajatul are: '|| v_nr_comenzi||' comenzi');
6
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
END; /
Observaţie: Într-un bloc PL/SQL se pot utiliza toate tipurile de variabile, respectând însă caracteristicile şi regulile de utilizare ale acestora. În exemplul următor se utilizază atât variabila de substituţie s_nume definită şi iniţializată prin comanda DEFINE, cât şi variabila de legătură g_salariul, dar şi variabila locală v_prenume de acelaşi tip cu coloana nume din tabela Angajati. Variabila de substituţie definită cu DEFINE va fi implicit de tipul CHAR: -- se afiseaza salariul si prenumele angajatului cu numele Abel SET SERVEROUTPUT ON VARIABLE g_salariul number DEFINE s_nume=Abel DECLARE v_prenume angajati.nume%type; BEGIN select prenume,salariul into v_prenume, :g_salariul from angajati where nume='&s_nume'; DBMS_OUTPUT.PUT_LINE ('Prenumele angajatului este: '||v_prenume); END; / print g_salariul
Sa se afiseze denumirea produsului din categoria software1 care are id-ul dat de la tastatura.
set serveroutput on VARIABLE g_denumire_produs varchar2(25) DEFINE v_categorie_produs=software1 BEGIN --pt a indroduce o valoare de la tastatura, se foloseste caracterul '&' plasat in fata numelui
SELECT denumire_produs INTO :g_denumire_produs FROM produse WHERE categorie='&v_categorie_produs' AND id_produs=&id_produs; END; / PRINT g_denumire_produs
EXERCIŢII PROPUSE Specificaţi ce se va afişa la rularea următorului bloc PL/SQL: 7
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
DECLARE v_var1 NUMBER :=100; v_var2 NUMBER; v_var3 NUMBER := v_var2; v_var4 VARCHAR(20) := 'variabila PL/SQL'; v_var5 NUMBER NOT NULL := v_var1; c_const1 CONSTANT DATE := TO_DATE('12/02/2007','dd/mm/yyyy'); c_const2 CONSTANT NUMBER NOT NULL := 2; c_const3 CONSTANT NUMBER := NULL; v_var6 NUMBER DEFAULT NULL; BEGIN DBMS_OUTPUT.PUT_LINE('variabila 1 = '||v_var1); DBMS_OUTPUT.PUT_LINE('variabila 2 = '||v_var2); DBMS_OUTPUT.PUT_LINE('variabila 3 = '||v_var3); DBMS_OUTPUT.PUT_LINE('variabila 4 = '||v_var4); DBMS_OUTPUT.PUT_LINE('variabila 5 = '||v_var5); DBMS_OUTPUT.PUT_LINE('constanta 1 = '||c_const1); DBMS_OUTPUT.PUT_LINE('constanta 2 = '||c_const2); DBMS_OUTPUT.PUT_LINE('constanta 3 = '||c_const3); DBMS_OUTPUT.PUT_LINE('variabila 6 = '||v_var6); END; /
Specificaţi ce se va afişa la rularea următorului bloc PL/SQL (care conţine blocuri imbricate, ilustrând domeniul de vizibilitate al unor variabile care au acelaşi nume): DECLARE var NUMBER; BEGIN var := 1; DBMS_OUTPUT.PUT_LINE(var); <> DECLARE 8
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
var NUMBER; BEGIN var :=2; DBMS_OUTPUT.PUT_LINE(var); END bloc1; DBMS_OUTPUT.PUT_LINE(var); <> DECLARE var NUMBER; BEGIN var :=3; DBMS_OUTPUT.PUT_LINE(var); <> DECLARE var NUMBER; BEGIN var :=4; DBMS_OUTPUT.PUT_LINE(var); DBMS_OUTPUT.PUT_LINE(bloc2.var); END bloc3; DBMS_OUTPUT.PUT_LINE(var); END bloc2; DBMS_OUTPUT.PUT_LINE(var); END; /
Specificaţi ce se va afişa la rularea următorului bloc PL/SQL DECLARE stoc NUMBER(3):=600; mesaj VARCHAR2(50):='Produsul 101'; BEGIN 9
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
DECLARE stoc NUMBER(3):=10; mesaj VARCHAR2(50):='Produsul 102'; um VARCHAR2(10):= ' bucati '; BEGIN stoc:= stoc+1; mesaj:='Stocul pentru '||mesaj||' este de: '||stoc||um; DBMS_OUTPUT.PUT_LINE(mesaj); END; stoc:= stoc+100; mesaj:='Stocul pentru '||mesaj||' este de: '||stoc||um; DBMS_OUTPUT.PUT_LINE(mesaj); END; / Să se calculeze suma a două numere, iar rezultatul să se dividă cu 3. Numerele se vor introduce de la tastatură.
VARIABLE g_rezultat number ACCEPT p_num1 PROMPT 'Introduceţi primul număr:' ACCEPT p_num2 PROMPT 'Introduceţi al doilea număr:' DECLARE v_num1 number(9,2):=&p_num1; v_num2 number(9,2):=&p_num2; BEGIN :g_rezultat:=(v_num1+v_num2)/3; END; / PRINT g_rezultat Sa se calculeze produsul a 2 numere, date de la tastatura.
--punem rezultatul intr-o variabila de legatura pe care o vom afisa in afara blocului cu PRINT
VARIABLE g_rezultat number --introducem cele doua numere de la tastatura
ACCEPT factor1 PROMPT 'Introduceti primul factor' ACCEPT factor2 PROMPT 'Introduceti al doilea factor' DECLARE factor1 number(3):=&factor1; --se foloseste & ca prefix pt factor1, pt ca in momentul executiei sa memoreze in factor1 valoarea pe care am introdus-o noi de la tastatura
factor2 number(3):=&factor2; BEGIN :g_rezultat:=factor1*factor2; end; / 10
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
PRINT g_rezultat
Sa se afiseze salariul angajatului cu id-ul introdus de la tastatura.
--folosim o variabila de legatura in care sa punem salariul si o afisam in afara blocului cu PRINT
VARIABLE g_salariul number --trebuie sa introducem id-ul angajatului
ACCEPT v_id PROMPT 'Introduceti id-ul angajatului' DECLARE v_id number(3):=&v_id; BEGIN SELECT salariul INTO :g_salariul FROM angajati WHERE id_angajat=v_id; END; / PRINT g_salariul
Sa se afiseze salariul angajatului cu numele si prenumele introduse de la tastatura.
--folosim o variabila de legatura in care sa punem salariul si o afisam in afara blocului cu PRINT VARIABLE g_salariul number --trebuie sa introducem numele si prenumele angajatului
ACCEPT v_nume PROMPT 'Introduceti numele angajatului' ACCEPT v_prenume PROMPT 'Introduceti prenumele angajatului' DECLARE v_nume varchar2(25):='&v_nume'; v_prenume varchar2(25):='&v_prenume'; BEGIN SELECT salariul INTO :g_salariul FROM angajati WHERE nume='&v_nume' and prenume='&v_prenume'; END; / PRINT g_salariul
11
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
Să se afişeze salariul mărit cu un procent. Salariul şi procentul se dau de la tastatură ACCEPT p_sal PROMPT 'Introduceţi salariul:' ACCEPT p_procent PROMPT 'Introduceţi procentul:' DECLARE v_sal number:=&p_sal; v_procent number:=&p_procent; BEGIN dbms_output.put_line(to_char(nvl(v_sal,0)*(1+nvl(v_procent,0)/100))); END; / TEMĂ: Să se afişeze cota de TVA pentru o anumită valoare introdusă de la tastatură.
INTERACŢIUNEA CU SERVERUL ORACLE PRIN COMENZI SQL
Interacţiunea se realizează prin intermediul comenzilor DDL (Data Definition Language), DCL (Data Control Lnaguage), DML (Data Manipulation Language), TPL (Transaction Processing Language) astfel:
PL/SQL nu suportă comenzi DDL sau DCL în cadrul unui bloc. Pentru executarea acestor comenzi se utilizeaza comanda EXECUTE IMMEDIATE: Comenzi DDL/DCL Executie CREATE, ALTER, DROP EXECUTE IMMEDIATE 'CREATE TABLE.... ' GRANT, REVOKE
PL/SQL suportă toate comenzile din limbajul de manipulare a datelor (DML) şi din cel de control al tranzacţiilor (TPL). Un bloc PL/SQL nu e o tranzacţie. Comenzile Commit/ Rollback/ Savepoint sunt independente de bloc dar pot să apară în interiorul său. Comenzi DML/TPL Executie SELECT, INSERT, UPDATE, DELETE, Se executa normal in cadrul blocului MERGE COMMIT, ROLLBACK, SAVEPOINT
Pot aparea în bloc dar au efect asupra tuturor tranzacţiilor din interiorul şi din 12
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
afara acestuia. Exemple: Se creează tabela prod în cadrul unui bloc PL/SQL: SET SERVEROUTPUT ON --comenzi LDD begin --execute immediate 'DROP table prod'; execute immediate 'CREATE table prod AS SELECT * FROM produse where 1=2'; end; /
Sa se creeze tabela STS in cadrul unui bloc.
set serveroutput on BEGIN --PL/SQL nu permite folosirea comenzilor LDD, prin urmare se foloseste sintaxa EXECUTE IMMEDIATE --id_trupa si nume_trupa sunt numele coloanelor sale
EXECUTE IMMEDIATE 'CREATE TABLE STS(id_trupa number(3), nume_trupa varchar2(25))'; END; / select * from STS; Se adaugă în tabela prod înregistrări din tabela produse: --comenzi LMD --comenzi LMD declare v_codp produse.id_produs%type; v_denp produse.denumire_produs%type; v_cat produse.categorie%type; v_des produse.descriere%type; begin SELECT id_produs, denumire_produs, categorie, descriere INTO v_codp, v_denp, v_cat, v_des FROM produse where id_produs=3133; INSERT INTO prod (id_produs, denumire_produs, categorie, descriere) VALUES (v_codp, v_denp, v_cat, v_des); DBMS_OUTPUT.PUT_LINE ('S-a adaugat in tabela prod produsul: '||v_codp||' '|| v_denp||' '||v_cat); end; 13
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
/ select * from prod;
Sa se adauge in tabela STS in cadrul unui bloc valorile 101,'Fantasticii'.
set serveroutput on begin --comanda INSERT este o comanda LMD, deci este permisa de pl/sql
insert into sts values (101,'Fantasticii'); end; / select * from sts;
Sa se creeze tabela angajati5 pe baza tabelei angajati.
set serveroutput on begin execute immediate 'create table angajati5 as select * from angajati'; end; / select * from angajati5;
Sa se adauge in tabela STS inregistrarile coloanelor id_angajat si nume pt id-ul 100.
set serveroutput on DECLARE --declaram variabilele in care sa se stocheze valorile pt id_angajat si nume --folosim %TYPE pentru ca variabele noastre sa preia tipul coloanelor id_angajat, respectiv nume, trebuie sa indicam si tabela din care acestea fac parte
v_id angajati.id_angajat%TYPE; v_nume angajati.nume%TYPE; BEGIN --comenzile LMD INSERT si SELECT sunt permise in blocul PL/SQL
SELECT id_angajat, nume INTO v_id,v_nume from angajati WHERE id_angajat=100; INSERT INTO STS(id_trupa,nume_trupa) VALUES(v_id,v_nume); end; / Pentru o mai mare flexibilitate se poate declara o variabilă de tip şir de caractere care să primească comanda DDL care va fi executată prin Execute Immediate: 14
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
Exemple: Se creează tabela emp_sal prin intermediul unei variabile de tip Varchar2. La creare, în tabela emp_sal se va adăuga o nouă înregistrare. SET SERVEROUTPUT ON VARIABLE G_EID NUMBER DECLARE V_SIR VARCHAR2(200); BEGIN :G_EID:=110; V_SIR:='CREATE table emp_sal AS SELECT id_angajat, nume, prenume, salariul FROM angajati where id_angajat='||:G_EID; DBMS_OUTPUT.PUT_LINE (V_SIR); EXECUTE IMMEDIATE V_SIR; END; / select * from emp_sal; Se adaugă o nouă coloană STOC în tabela produse: DECLARE V_SIR VARCHAR2(200); BEGIN V_SIR:='ALTER TABLE PRODUSE ADD (STOC NUMBER (7))'; DBMS_OUTPUT.PUT_LINE (V_SIR); EXECUTE IMMEDIATE V_SIR; END; / select * from PRODUSE; Manipularea datelor in PL/SQL se face prin instrucţiunile DML (INSERT, UPDATE, DELETE) care pot fi lansate fără restricţii în PL/SQL. Exemple: Comanda INSERT Se adaugă o nouă înregistrare în tabela emp_sal: BEGIN INSERT INTO emp_sal (id_angajat, nume, prenume, salariul) VALUES (200, 'Pop', 'Marian', 7500); END; / select * from emp_sal; Se adaugă o nouă înregistrare în tabela produse prin introducerea valorilor cu ajutorul variabilelor de substituţie: 15
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
BEGIN INSERT INTO produse (id_produs, denumire_produs, categorie, stoc) VALUES (&id, '&denumire', '&categorie', &stoc); END; / select * from produse; Comanda UPDATE Se măreşte cu un procent salariul angajaţilor din tabela emp_sal care au în prezent salariul mai mic decât o anumită valoare: DECLARE v_procent number:=0.1; v_prag angajati.salariul%type:=10000; BEGIN UPDATE emp_sal SET salariul=salariul*(1+v_procent) WHERE salariul
16
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
Se şterge angajatul cu numele Pop din tabela emp_sal: DECLARE BEGIN DELETE FROM emp_sal WHERE initcap(nume) like 'Pop%'; ROLLBACK; END; / select * from emp_sal; EXERCITII PROPUSE 1. Creaţi un bloc PL/SQL ce adaugă un produs nou in tabela PRODUSE.
set serveroutput on DECLARE v_id produse.id_produs%TYPE; v_denumire produse.denumire_produs%TYPE; BEGIN v_id:=&v_id; v_denumire:='&v_denumire'; INSERT INTO produse (id_produs,denumire_produs) VALUES (v_id,v_denumire); end; / a. Folosiţi maximul dintre codurile produselor si adăugaţi 10 la aceasta valoare, folosind-o ca valoare pentru codul produsului nou introdus. set serveroutput on DECLARE --avem nevoie de o variabila care sa stocheze maximul dintre codurile produselor v_max_cod produse.id_produs%TYPE; BEGIN SELECT MAX(id_produs) INTO v_max_cod FROM produse; DBMS_OUTPUT.PUT_LINE('Maximul dintre codurile produselor este='|| v_max_cod); --comanda UPDATE este LMD deci poate aparea intr-un bloc PL/SQL UPDATE produse SET id_produs=v_max_cod+10 WHERE denumire_produs='Frigider'; END; /
select * from produse where denumire_produs='Frigider';
17
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
b. Folosiţi un parametru (variabila de substituţie) pentru categoria şi stocul produsului. set serveroutput on ACCEPT v_categorie PROMPT 'Introduceti categoria produsului' ACCEPT v_stoc PROMPT 'Introduceti stocul produsului' DECLARE v_categorie produse.categorie%TYPE; v_stoc produse.stoc%TYPE; BEGIN v_categorie:='&v_categorie'; v_stoc:=&v_stoc; DBMS_OUTPUT.PUT_LINE('Produsul cu id-ul 3535 se afla in categoria '|| v_categorie||' si are stocul de '||v_stoc); END; / c. Lăsaţi descrierea produsului NULL. d. Executaţi blocul. COMMIT 2. Creaţi un bloc PL/SQL ce selectează stocul maxim pentru produsele existente in tabela PRODUSE. Tipăriţi rezultatul pe ecran. set serveroutput on VARIABLE g_stoc_maxim number DECLARE stoc_maxim number(3); BEGIN SELECT MAX(stoc) into stoc_maxim from produse; :g_stoc_maxim:=stoc_maxim; end; / print g_stoc_maxim
3. Creaţi un bloc PL/SQL care şterge un produs pe baza codului acestuia primit ca parametru (variabila de substituţie). Anulaţi ştergerea dintr-ul alt bloc PL/SQL. set serveroutput on ACCEPT v_cod PROMPT 'Introduceti codul produsului' BEGIN v_cod:=&v_cod; DELETE FROM produse WHERE id_produs=v_cod; 18
Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 2
end; /
19