Facultatea de Cibernetică, Statistică şi Informatică Economică SGBD Oracle – seminarul 3

STRUCTURI FUNDAMENTALE DE PROGRAMARE STRUCTURI ALTERNATIVE
Structura IF..THEN..END IF IF cond1 THEN secvcom1 ELSE secvcom2 END IF; IF cond1 THEN secvcom1 ELSE IF cond2 THEN secvcom2 END IF; END IF; • se poate folosi clauza ELSIF în loc de IF imbricate IF cond1 THEN secvcom1 ELSIF cond2 THEN secvcom2; ELSIF cond3 THEN secvcom3; --------------------------------------ELSIF condN THEN secvcomN; ELSE secvcomN+1; END IF;

Exemplu: În funcţie de valoarea stocului produsului cu codul 3133, acesta se va afişa modificat pe ecran prin intermediul variabilei v_stoc. DECLARE v_stoc produse.stoc%type; BEGIN SELECT stoc into v_stoc from produse where id_produs=3133; dbms_output.put_line ('Stocul initial este: '||v_stoc); IF v_stoc < 500 THEN v_stoc:=2* v_stoc; ELSIF v_stoc between 500 and 1000 THEN v_stoc:=1.5 * v_stoc; ELSE v_stoc:=1.25* v_stoc; END IF; dbms_output.put_line('Stocul final este: '||v_stoc); end; /
1

Facultatea de Cibernetică. fiind deci NULL: DECLARE nota number. Se termina cu END CASE. sunteti admis!').put_line('Felicitari. sau a:=NULL... dar nu este iniţializată. Structura CASE . Se termina cu END • sintaxa CASE (CASE Statement) care executa o anumita instructiune. CASE Expressions: Variabila:= CASE [Selector] WHEN expression1 THEN result1 WHEN expression2 THEN result2 ----------------------------------------WHEN expressionN THEN resultN [ELSE result N+1] END. Sunt 2 variante: • expresii CASE (CASE Expressions) care intorc un rezultat intr-o variabila. Y:=NULL. Statistică şi Informatică Economică SGBD Oracle – seminarul 3 Atentie la variabilele de tip NULL si evaluarea in IF! De exemplu. sunteţi admis!” din cauza faptului că variabila nota este declarată. 2 . THEN. IF x!=y then --intoarce NULL si nu TRUE END IF. Begin IF nota<5 THEN dbms_output. iar fiecare rand se termina cu ..put_line('Ne pare rau.. / Observaţi cazurile de mai jos: X:=10. ELSE dbms_output. IF a=b then --intoarce NULL si nu TRUE END IF. în următoarea situaţie se va afişa “Felicitări. candidatul este respins!'). END IF.. END.. WHEN. b:=NULL.

/ Structuri repetitive Structura LOOP……END LOOP LOOP Secventa comenzi. 3 .put_line('Salariul final este: '|| v_stoc).stoc%type. dbms_output. / CASE Statement: CASE [Selector] WHEN expression1 THEN action1. v_proc number(4.5 else 1.put_line('Stocul initial este: '||v_stoc). BEGIN SELECT stoc into v_stoc from produse where id_produs=3133.25 END.put_line('Salariul final este: '|| v_stoc). dbms_output. Exemplu: DECLARE v_stoc produse.2).25. end.stoc%type. [ELSE action N+1].5. dbms_output. dbms_output. ----------------------------------------WHEN expressionN THEN actionN. end. CASE when v_stoc < 500 THEN v_stoc:= v_stoc *2.put_line('Stocul initial este: '||v_stoc). END CASE. v_stoc:= v_stoc *v_proc. WHEN expression2 THEN action2. Statistică şi Informatică Economică SGBD Oracle – seminarul 3 Exemplu: DECLARE v_stoc produse. BEGIN SELECT stoc into v_stoc from produse where id_produs=3133. v_proc:= CASE when v_stoc < 500 THEN 2 when v_stoc between 500 and 1000 THEN 1. when v_stoc between 500 and 1000 THEN v_stoc:= v_stoc *1. END CASE.Facultatea de Cibernetică. else v_stoc:= v_stoc *1.

set serveroutput on DECLARE v_nr number(2):=10.put_line(v_nr). Exemplu: Se afişează pe ecran utilizând structura loop…end loop numerele 9. END. exit when v_sal<v_salmediu or i>110.salariul%type. END LOOP. i:=i+1. set serveroutput on DECLARE 4 . Secventa comenzi 2. / Se afişează în ordine angajaţii cu codurile în intervalul 100-110 atât timp cât salariul acestora este mai mic decât media: DECLARE v_sal angajati. end loop.END LOOP WHILE cond LOOP Secventa comenzi 1. BEGIN loop v_nr:=v_nr-i. 4.LOOP…. i:=i+1. EXIT [WHEN cond]. end loop. 0. i number(4):=100. BEGIN SELECT avg(salariul) into v_salmediu from angajati. 0. 4. end. v_salMediu v_sal%type. exit when v_nr < 0.7. i number(2):=1. Statistică şi Informatică Economică SGBD Oracle – seminarul 3 EXIT [WHEN cond]..put_line('Salariul mediu este: '||v_salmediu). loop select salariul into v_sal from angajati where id_angajat=i. dbms_output.7. dbms_output. Exemplu: Se afişează pe ecran utilizând structura while loop…end loop numerele 9.Facultatea de Cibernetică.put_line('Salariatul cu codul '||i||' are salariul: '||v_sal). END LOOP. dbms_output. / Structura WHILE….

END LOOP. Statistică şi Informatică Economică SGBD Oracle – seminarul 3 v_nr number(2):=10..put_line('Salariatul cu codul '||i||' are salariul: '||v_sal). end loop. dar sa aiba valori care pot fi convertite la un intreg (de exemplu 20/13 sau 11/5). Daca aceste 2 valori vor fi egale ca intregi atunci instructiunile din interiorul ciclului se executa o singura data. v_salMediu v_sal%type. i number(4):=100. BEGIN while v_nr > 0 loop v_nr:=v_nr-i. i:=i+1. i number(2):=1. END LOOP. END. Exemple: Se afişează pe ecran utilizând structura for…end loop numerele 9. 0. / Structura FOR….put_line('Salariul mediu este: '||v_salmediu). / Se afişează în ordine angajaţii cu codurile în intervalul 100-110 atât timp cât salariul acestora este mai mic decât media: DECLARE v_sal angajati.3 LOOP Secventa comenzi. i:=i+1. Observatii: Valorile intervalului pot fi de orice tip.salariul%type.7.Facultatea de Cibernetică. EXIT [WHEN cond]. De exemplu secventa: FOR i IN 3.. end.put_line(v_nr).LOOP…. exit when v_sal<v_salmediu.valmax LOOP Secventa comenzi. dbms_output. while i<=110 loop select salariul into v_sal from angajati where id_angajat=i. set serveroutput on 5 .. 4. end loop. dbms_output. dbms_output. BEGIN SELECT avg(salariul) into v_salmediu from angajati.END LOOP FOR var IN [REVERSE] valmin.

v_salMediu v_sal%type.160. -. i number(2)..110 loop select salariul into v_sal from angajati where id_angajat=i. v_nume angajati.nr_comanda) into v_nr from comenzi c.put_line('Salariatul cu id-ul: '||v_id||' are: '||v_nr||' comenzi'). / Să se afişeze numărul de comenzi ale fiecărui angajat al cărui id este situat în intervalul 155. for i in 100. exit when v_nr < 0.nume%type.put_line('Salariul mediu este: '||v_salmediu). dbms_output. BEGIN for i in 1. end. / Să se încarce în tabela MESAJE numere de la 1…10 cu excepţia lui 6 şi 8. CREATE TABLE MESAJE (REZ VARCHAR2(30)). end loop.. dbms_output.10 loop v_nr:=v_nr-i.160 loop v_nr:=0. SELECT count(c. exit when v_sal<v_salmediu.angajati a where c.id_angajat=v_id.i nu mai trebuie declarat BEGIN SELECT avg(salariul) into v_salmediu from angajati.salariul%type.id_angajat%type. end. / Se afişează în ordine angajaţii cu codurile în intervalul 100-110 atât timp cât salariul acestora este mai mic decât media: DECLARE v_sal angajati. end loop. BEGIN for v_id in 155. dbms_output.id_angajat=a.id_angajat and a. END. dbms_output. v_id angajati. end loop. Statistică şi Informatică Economică SGBD Oracle – seminarul 3 DECLARE v_nr number(2):=10. BEGIN 6 .. dar să se întrerupă afişarea în cazul în care se găseşte primul angajat din acest interval care nu are nici o comandă: DECLARE v_nr number. exit when v_nr=0..put_line('Salariatul cu codul '||i||' are salariul: '||v_sal).Facultatea de Cibernetică.put_line(v_nr).

/ Structuri LOOP imbricate (se vor eticheta loop-urile) BEGIN <<LOOP_EXTERN>> LOOP v_var:=v_var+1. END LOOP. Tipul RECORD Reprezintă un grup de date logic corelate (de exemplu.nume_câmp.Facultatea de Cibernetică. EXIT LOOP_EXTERN WHEN cond1. datele despre un client: codc.. END LOOP. ……………………………. nume. adresa sunt diferite ca tip dar corelate logic)... ………………………… END LOOP. <<LOOP_INTERN>> LOOP ………………………. ELSE INSERT INTO MESAJE(REZ) VALUES (i). COMMIT. END.  Când se declară un PL/SQL record pentru aceste câmpuri. EXIT WHEN v_var>10. END IF. ele pot fi manipulate ca o unitate. TIPURI DE DATE COMPUSE 1. TYPE nume_record IS RECORD (nume_câmp TIP_DATA [.   Câmpurile unui record sunt referite nume_record. Variabilă NUME_RECORD.  Fiecare câmp (element al structurii) are un nume şi un tip de dată.).10 LOOP IF i=6 OR i=8 THEN NULL. EXIT WHEN cond2. Statistică şi Informatică Economică SGBD Oracle – seminarul 3 FOR i IN 1. END.nume_câmp TIP_DATA:=| DEFAULT valoare]. Exemplu: 7 .

v_den|| ' are pretul minim: '|| vrec_prod. BEGIN loop SELECT * into vrec_dep from departamente where id_departament=i. dbms_output.denumire_departament). Statistică şi Informatică Economică SGBD Oracle – seminarul 3 Utilizând un tip de dată record definit de utilizator să se afişeze preţul minim al produsului cu codul 3133. DECLARE vrec_prod produse%rowtype. DECLARE TYPE tip_produse IS RECORD (v_cod produse. Exemple: Utilizând un tip de dată record de acelaşi tip cu tabela produse să se afişeze preţul minim al produsului cu codul 3133. END.id_departament|| ' are denumirea de: '||vrec_dep.put_line('Produsul: '|| vrec_prod. end loop. 8 . 30. NUME_RECORD tabela%ROWTYPE. v_den produse. i:=i+10.put_line('Departamentul: '|| vrec_dep. / Utilizând un tip de dată record de acelaşi tip cu departamente să se afişeze denumirea fiecărui departament cu id-ul: 10. / Pentru a defini un record pe baza coloanelor unei tabele se foloseşte %rowtype . 20. denumire_produs. i number:=10. vrec_prod tip_produse.denumire_produs%type. BEGIN SELECT * into vrec_prod from produse where id_produs=3133.id_produs%type NOT NULL:=3000.denumire_produs|| ' are pretul minim: '||vrec_prod. 40. pret_min into vrec_prod from produse where id_produs=3133. BEGIN SELECT id_produs.pret_min). In acest caz numele elementelor din record au acelaşi nume ca şi coloanele tabelei.Facultatea de Cibernetică. dbms_output.put_line('Produsul: '|| vrec_prod.v_pret_min). dbms_output. DECLARE vrec_dep departamente%rowtype. END.pret_min%type). v_pret_min produse. exit when i>=50. acelaşi tip de date şi se găsesc în aceeaşi ordine. 50.

end loop.put_line('Nume produs: '|| v_tab(i)).first.EXISTS(i) v_tab.NEXT(i) v_tab.DELETE(i) sau v_tab.v_tab.. --extragerea din tabela for i in v_tab.denumire_produs%type index by pls_integer. 2147483647)  Se pot utiliza urmatoarele proprietăţi şi metode:  v_tab. Statistică şi Informatică Economică SGBD Oracle – seminarul 3 END.denprodus – produse. PRIOR(i) şi v_tab.COUNT v_tab.put_line('Total produse in tabela: '|| v_tab.denprodus%type DECLARE --declarare type num_table is table of produse.câmp. BEGIN --incarcarea in tabela: loop SELECT denumire_produs into v_tab(i) from produse where id_produs=i. dar în ordine aleatorie şi poate fi negativ. / 9 . exit when i>2255.LAST v_tab.last loop IF v_tab. end if. v_tab num_table. FIRST şi v_tab. Adresarea se realizează cu v_tab(index). v_tab nume_tab.EXISTS(i) then dbms_output. dbms_output. END. i:=i+1.  Indexul este unic.DELETE sau v_tab.coloana%type [NOT NULL]| tabela%rowtype} INDEX BY PLS_INTEGER|BINARY_INTEGER|VARCHAR2(dimensiune). Tipuri de tabele INDEX BY TYPE nume_tab IS TABLE OF {TIP_DATA [variabila%type | tabela. / 2.Facultatea de Cibernetică. i number(5):=2252.j) Exemplu: --Utilizarea unei tabele de tipul produse.DELETE(i. end loop.count). Intervalul pt PLS_INTEGER este (-2147483647.

first. end loop. BEGIN --incarcarea in tabela: for i in 130.%ROWTYPE DECLARE --declararea tipului si a variabilei type ang_table is table of angajati%rowtype index by pls_integer. dbms_output. / 10 .. Statistică şi Informatică Economică SGBD Oracle – seminarul 3 Exemplu: --Utilizarea unei tabele de acelaşi tip cu agenţi .last loop dbms_output.count).nume|| ' lucreaza in departamentul: '|| v_tab(i).135 loop SELECT * into v_tab(i) from angajati where id_angajat=i.Facultatea de Cibernetică. --extragerea din tabela for i in v_tab.v_tab. v_tab ang_table.. end loop.id_departament). END.put_line('Angajatul: '|| v_tab(i).put_line('Total angajati in tabela: '|| v_tab.

Sign up to vote on this title
UsefulNot useful