Sunteți pe pagina 1din 47

10.

Blocul urmator afiseaza: DECLARE v_x NUMBER(9,2):=10; v_y NUMBER(9,2); v_message VARCHAR2(20); BEGIN v_y:= NULL; IF v_x !=v_y THEN v_message := NOT EQUAL; ELSE v_message := EQUAL; END IF; DBMS_OUTPUT.PUT_LINE(v_message); END;

a. b. c. d.

NOT EQUAL EROARE EQUAL NIMIC

EX. Care din urmatoarele afirmatii este adevarata: a. b. c. d. Pentru a insera un element nou intr-un tablou imbricat, dimensiunea acestuia trebuie extinsa cu ajutorul metodei EXTEND Pentru adaugarea de linii intr-un tabel indexat, acesta trebuie sa fie initializat cu ajutorul constructorului Pentru a insera un element nou intr-un tabel indexat, acesta trebuie extins cu ajutorul metodei EXTEND Spre deosebire de tablourile indexate, vectorii nu au o dimensiune maxima

14. a.

Care dintre urmatoarele blocuri se executa cu erori? declare alfa interval year to month; begin alfa :=interval 2 - 5 year to month; DBMS_OUTPUT.PUT_LINE(alfa = || alfa); end; declare alfa interval year to month; begin alfa :=interval 8 month; DBMS_OUTPUT.PUT_LINE(alfa = || alfa); end;

b.

c.

d.

declare alfa interval year to month; begin alfa := 20 - 10; DBMS_OUTPUT.PUT_LINE(alfa = || alfa); end; declare alfa interval month; begin alfa :=interval 8 month; DBMS_OUTPUT.PUT_LINE(alfa = || alfa); end;

28. Care dintre urmatoarele variante apeleaza corect functia F_TEST care are un singur parametru numeric? a. b. SELECT F_TEST (80) FROM DUAL ; DECLARE nr NUMBER; BEGIN Nr:=F_TEST(); END; VARIABLE nr NUMBER CALL F_TEST () INTO:nr; PRINT nr VARIABLE nr NUMBER CALL FUNCTION F_TEST (80) INTO:nr; PRINT nr Care dintre urmatoarele declaratii de variabile este corecta?

c.

d.

16[1]. a.

b.

c.

v 1. v2VARCHAR2(35); v3 CHAR(10):=Valid; v4 DATE DEFAULT SYSDATE; v1 NUMBER(5,2)=10,25; v2 BOOLEAN:=10<20; v3 DATE=SYSDATE; v1 CHAR(10):=Informatica . v2 NUMBER(2) NOT NULL=10; v3 VARCHAR2(20):= Matematica;

29. Care dintre urmatoarele vizualizari poate fi folosita in urmatoarea comanda pentru a vizualiza codul complet al subprogramului P1: SELECT TEXT FROM . WHERE NAME = UPPER(P1); a. b. c. d. USER_OBJECTS USER_ERRORS USER_FUNCTIONS USER_SOURCE

9. a.

Care este varianta corecta pentru afisarea variabilei v_mesaj ? VARIABLE v_mesaj VARCHAR2 (50) BEGIN :v_mesaj := Invat PL/SQL; PRINT v_mesaj; END; / VARIABLE v_mesaj VARCHAR2 (30) BEGIN :v_mesaj := Invat PL/SQL; END; / PRINTv_mesaj VARIABLE v_mesaj VARCHAR2 (50) BEGIN :v_mesaj := Invat PL/SQL; DBMS_OUTPUT.PUT_LINE ( v_mesaj); END; /

b.

c.

1. Care este varianta corecta pentru declararea urmatoarelor variabile? a. v_valoare NUMBER(15) NOT NULL := 0; v_data_achizitie DATE DEFAULT SYSDATE; c_valoare CONSTANT NUMBER:=1000; v_cod_oper opere%TYPE;

b.

v_valoare v_data_achizitie c_valoare v_cod opera v_valoare v_data_achizitie c_valoare v_ cod_opera

NUMBER(15) NOT NULL; DATE DEFAULT SYSDATE; CONSTANT NUMBER; opere.cod_opera%TYPE; NUMBER(15) NOT NULL := 0; DATE DEFAULT SYSDATE; CONSTANT NUMBER:= 1000; opere.cod_opera%TYPE;

19. Care este varianta corecta pentru a defini un tablou imbricat de numere care are ca elemente primele 10 numere naturale? a. DECLARE TYPE tablou IS TABLE OF NUMBER; tab tablou:= tablou(); BEGIN FOR i IN 110 LOOP tab.NEXT(i) tab(i) := i; END LOOP; END; DECLARE TYPE tablou IS TABLE OF NUMBER; tab tablou:= tablou(); BEGIN FOR i IN 110 LOOP tab.EXTEND; tab(i) := i; END LOOP; END; DECLARE TYPE tablou IS TABLE OF NUMBER; tab tablou:= tablou(); BEGIN FOR i IN 110 LOOP tab(i) := tab(i) + i; END LOOP; END; DECLARE TYPE tablou IS TABLE OF NUMBER; tab tablou:= tablou(); BEGIN FOR i IN 110 LOOP tab(i) := i; END LOOP; END;

b.

c.

d.

15[1] Care este varianta corecta prin care se obtine pentru fiecare department fisa angajatilor care lucreaza in acesta in rezultat incluzandu-se si departamentele in care nu lucreaza nimeni?

a.

b.

c.

BEGIN FOR d IN(SELECT nume_departament FROM departamente)LOOP BDMS_OUTPUT.PUT_LINE(Departamentul|| d nume_departament); FOR a IN(SELECT erase FROM angajati)LOOP DBMS_OUTPUT.PUT_LINEA(Angajatul||a.nume); END LOOP; END LOOP; END; BEGIN FROM d IN( departamente d angajati a WERE d id_departament=a id_departament)LOOP DBMS_OUTPUT.PUT_LINE(Departamentul|| d nume_departament); DBMS_OUTPUT.PUT_LINEA(Angajatul||d.nume); END LOOP; END; BEGIN FOR d IN(SELECT nume_departament, id_departament FROM departamente)LOOP BDMS_OUTPUT.PUT_LINE(Departamentul|| d. nume_departament); FOR a IN( SELECT nume FROM angajati WERE id_departament=d. id_departament)LOOP DBMS_OUTPUT.PUT_LINEA(Angajatul||a.nume); END LOOP; END LOOP; END;

20. Care este varianta de bloc PL/SQL corecta pentru a mentine intr-un vector codurile angajatilor care au salariul mai mic decat 20000 si lucreaza in departamentul 90?

a.

b.

c.

DECLARE TYPE t_id IS VARRAY(100) OF angajati.id_angajat%TYPE; v_id t_id :=t_id(); BEGIN SELECT id_angajat INTO v_id FROM angajati WHERE id_departement=90 AND salariu < 20000; END; DECLARE TYPE t_id IS VARRAY(100) OF angajati.id_angajat%TYPE; v_id t_id :=t_id(); BEGIN SELECT id_angajat BULK COLLECT INTO v_id FROM angajati WHERE id_departament=90 AND salariu < 20000; END; DECLARE TYPE t_id IS VARRAY(100) OF angajati.id_angajat%TYPE; v_id t_id :=t_id; BEGIN SELECT id_angajat BULK COLLECT INTO t_id FROM angajati WHERE id_departement=90 AND salariu < 20000; END;

21. Care este varianta corecta de cod PL/SQL care sterge din tabelul joburi, joburile pentru care salariul minim este 4000 sau 8200, daca aceste valori sunt mentinute intr-un vector? a. DECLARE TYPE min_sal IS VARRAY(20) OF NUMBER; v_min_sal min_sal:=min_sal(4000,8200); BEGIN FORALL i IN v_min_sal.FIRST..v_min_sal. LAST DELETE FROM joburi WHERE salariu_min=v_min_sal(i); END;

b. DECLARE TYPE min_sal IS VARRAY(20) OF NUMBER; v_min_sal min_sal:=min_sal(4000,8200); BEGIN FOR i IN v_min_sal.FIRST..v_min_sal. LAST DELETE FROM joburi WHERE salariu_min=v_min_sal(i); END; c. DECLARE TYPE min_sal IS VARRAY(20) OF NUMBER; v_min_sal min_sal; BEGIN FORALL i IN v_min_sal.FIRST..v_min_sal. LAST DELETE FROM joburi WHERE salariu_min=v_min_sal(i); END;

22. Care este varianta corecta prin care se adauga in tabelul angajati un nou camp numit telefon de tip tablou imbricat, pt care se vor stoca pt fiecare salariat numerele sale de telefon, si apoi se insereaza o linie noua in tabel? a. CREATE TYPE lista AS TABLE OF VARCHAR2(20); ALTER TABLE angajati ADD (telefon lista) NESTED TABLE telefon STORE AS tabel_tel; INSERT INTO angajati VALUES(200,xxx,4000,40000,lista(0214567898,0214567899)); b. CREATE TYPE lista AS TABLE OF VARCHAR2(20); ALTER TABLE angajati ADD telefon lista; INSERT INTO angajati VALUES(200,xxx,4000,40000,lista(0214567898,0214567899)); c. CREATE TYPE lista AS TABLE OF VARCHAR2(20); ALTER TABLE angajati ADD (telefon lista) NESTED TABLE telefon STORE AS tabel_tel; INSERT INTO angajati telefon VALUES((lista(0214567897,0214567898,0214567899));

23. Care este varianta corecta prin care se incarca date dintr-un cursor intr-o colectie?

a. DECLARE TYPE tip_job IS TABLE OF joburi.nume_job%TYPE; v_nume tip_job; CURSOR c_joburi IS SELECT nume_job FROM joburi; BEGIN OPEN c_joburi; SELECT c_joburi INTO v_nume; CLOSE c_joburi; END; b. DECLARE TYPE tip_job IS TABLE OF joburi.nume_job%TYPE; v_nume tip_job; CURSOR c_joburi IS SELECT nume_job FROM joburi; BEGIN OPEN c_joburi; FETCH c_joburi BULK COLLECT INTO v_nume; CLOSE c_joburi; END; c. DECLARE TYPE tip_job IS TABLE OF joburi.nume_job%TYPE; v_nume tip_job; CURSOR c_joburi IS SELECT nume_job FROM joburi; BEGIN OPEN c_joburi; FETCH c_joburi INTO v_nume; CLOSE c_joburi; END;

34. Care este varianta corecta pentru a crea specificatia unui pachet, care defineste un cursor pentru obtinerea datelor si o procedura ce actualizeaza campul id_job al unui angajat cu un anumit cod? a. CREATE OR REPLACE PACKAGE manager_pkg IS CURSOR joburi_curs IS SELECT id_angajat, id_job FROM angajati; PROCEDURE update_job(p_ang_id IN angajati.id_angajat%TYPE, P_id_job OUT angajati.id_job%TYPE); END update_job; END manager_pkg; CREATE OR REPLACE PACKAGE manager_pkg IS CURSOR joburi_curs IS SELECT id_angajat, id_job FROM angajati; PROCEDURE update_job(p_ang_id IN angajati.id_angajat%TYPE, P_id_job IN angajati.id_job%TYPE); END manager_pkg;

b.

c.

CREATE OR REPLACE PACKAGE manager_pkg IS CURSOR joburi_curs IS SELECT id_angajat, id_job FROM angajati; PROCEDURE update_job(p_ang_id IN angajati.id_angajat%TYPE, P_id_job OUT angajati.id_job%TYPE); END manager_pkg;

24. Care este varianta incorecta prin care se obtin numele si salariul angajatilor care au salariul mai mic decat 2500 si nu lucreaza in departamentul avand codul 80?

a. DECLARE v_nume angajati.nume%TYPE; v_sal angajati.salariu%TYPE; CURSOR c(var_sal NUMBER, var_dept NUMBER) IS SELECT nume, salariu FROM angajati WHERE salariu<var_sal AND id_departament<>var_dept; BEGIN OPEN c(2500,80); LOOP FETCH c INTO v_nume, v_sal; EXIT WHEN c%NOTFOUND; DBMS_OUTPUT.PUT_LINE(Salariatul ||v_nume|| are salariul || v_sal); END LOOP; CLOSE c; END; b. DECLARE v_sal :=2500; v_dept := 80; BEGIN FOR ind IN (SELECT nume, salariu FROM angajati WHERE salariu<var_sal AND id_departament<>var_dept) LOOP DBMS_OUTPUT.PUT_LINE(Salariatul ||ind_nume|| are salariul || ind_salariu); END LOOP; END;

c. DECLARE CURSOR c(var_sal NUMBER, var_dept NUMBER) IS SELECT nume, salariu FROM angajati WHERE salariu<var_sal AND id_departament<>var_dept; BEGIN FOR ind IN c(2500,80) LOOP DBMS_OUTPUT.PUT_LINE(Salariatul ||ind_nume|| are salariul || ind_salariu); END LOOP; END;

EX. Care este varianta corecta pentru declararea urmatoarelor variabile? a. c_valoare CONSTANT NUMBER; v_cod_dep departamente.id_departament%TYPE; v_dep departamente%ROWTYPE :=10,'Vanzari',101,'Bucuresti'; c_valoare CONSTANT NUMBER := 1000; v_cod_dep departamente%TYPE; v_ang angajati%ROWTYPE; c_valoare CONSTANT NUMBER := 1000; v_cod_dep departamente.id_departament%TYPE; v_dep departamente%ROWTYPE;

b.

c.

40. Care este varianta corecta care defineste un trigger la nivel de comanda ce determina inserarea in tabelul audit_angajati a unui mesaj corespunzator tipului de comanda LMD executata asupra tabelului angajati?

a.

CREATE TRIGGER trigger_audit_angajati AFTER INSERT OR DELETE OR UPDATE ON audit_angajati FOR EACH ROW BEGIN IF INSERTING THEN INSERT INTO audit_angajati (actiune) VALUES (:NEW.INSERT); ELSIF DELETING THEN INSERT INTO audit_angajati (actiune) VALUES (:OLD.DELETE); ELSE INSERT INTO audit_angajati (actiune) VALUES (:NEW.UPDATE); END IF; END;

b.

c.

CREATE TRIGGER trigger_audit_angajati AFTER INSERT OR AFTER DELETE OR AFTER UPDATE ON angajati BEGIN IF INSERTING THEN INSERT INTO audit_angajati (actiune) VALUES (Inserare); ELSIF DELETING THEN INSERT INTO audit_angajati (actiune) VALUES (Stergere); ELSE INSERT INTO audit_angajati (actiune) VALUES (Actualizare); END IF; END; CREATE TRIGGER trigger_audit_angajati AFTER INSERT OR DELETE OR UPDATE ON angajati BEGIN IF INSERTING THEN INSERT INTO audit_angajati (actiune) VALUES (Inserare); ELSIF DELETING THEN INSERT INTO audit_angajati (actiune) VALUES (Stergere); ELSE INSERT INTO audit_angajati (actiune) VALUES (Actualizare); END IF; END;

25. Care este varianta corecta prin care se afiseaza numele si prenumele primelor 5 persoane angajate in luna martie in anul 1997?

a. DECLARE v_nume angajati.nume%TYPE; v_prenume angajati.prenume%TYPE; CURSOR c IS SELECT nume, prenume FROM angajati WHERE TO_CHAR(data_angajarii, MM-YYYY)=03-1997 ORDER BY data_angajarii ASC; BEGIN OPEN c; LOOP FETCH c INTO v_nume, v_prenume; EXIT WHEN c%ROWCOUNT>5; DBMS_OUTPUT.PUT_LINE(v_nume|| || v_prenume); END LOOP; CLOSE c; END; b. DECLARE v_nume angajati.nume%TYPE; v_prenume angajati.prenume%TYPE; CURSOR c IS SELECT nume, prenume FROM angajati WHERE TO_CHAR(data_angajarii, MM-YYYY)=03-1997 ORDER BY data_angajarii; BEGIN OPEN c; LOOP FETCH c INTO v_nume, v_prenume; EXIT WHEN c%ROWCOUNT>5 OR c%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_nume|| || v_prenume); END LOOP; CLOSE c; END; c. DECLARE v_nume angajati.nume%TYPE; v_prenume angajati.prenume%TYPE; CURSOR c IS SELECT nume, prenume FROM angajati WHERE TO_CHAR(data_angajarii, MM-YYYY)=03-1997 ORDER BY data_angajarii DESC; BEGIN OPEN c; LOOP FETCH c INTO v_nume, v_prenume; EXIT WHEN c%ROWCOUNT<5 AND c%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_nume|| || v_prenume); END LOOP; END;

EX. Care este varianta corecta de definire a unui pachet care contine o constanta avand valoarea 600 si o functie care verifica, folosind acea constanta, daca un angajat lucreaza in companie de mai mult de 50 de ani? a. CREATE OR REPLACE PACKAGE check_ang_pkg IS g_max_length_of_service NUMBER; PROCEDURE check_data_angajarii (p_date IN angajati.data_angajarii%TYPE); END check_ang_pkg; CREATE OR REPLACE PACKAGE BODY check_ang_pkg IS PROCEDURE check_data_angajarii (p_date IN angajati.data_angajarii%TYPE) IS BEGIN IF MONTHS_BETWEEN(SYSDATE, p_date) > g_max_length_of_service THEN RAISE_APPLICATION_ERROR(-20202, 'Varsta de pensionare'); END IF; END check_ang_pkg; CREATE OR REPLACE PACKAGE check_ang_pkg IS g_max_length_of_service CONSTANT NUMBER := 600; PROCEDURE check_data_angajarii (p_date OUT angajati.data_angajarii%TYPE); END check_ang_pkg; CREATE OR REPLACE PACKAGE check_ang_pkg IS PROCEDURE check_data_angajarii (p_date IN angajati.data_angajarii%TYPE) IS BEGIN IF MONTHS_BETWEEN(SYSDATE, p_date) > g_max_length_of_service THEN RAISE_APPLICATION_ERROR(-20202, 'Varsta de pensionare'); END IF; END check_data_angajarii; CREATE OR REPLACE PACKAGE check_ang_pkg IS g_max_length_of_service CONSTANT NUMBER := 600; PROCEDURE check_data_angajarii (p_date IN angajati.data_angajarii%TYPE); END check_ang_pkg; CREATE OR REPLACE PACKAGE BODY check_ang_pkg IS PROCEDURE check_data_angajarii (p_date IN angajati.data_angajarii%TYPE) IS BEGIN IF MONTHS_BETWEEN(SYSDATE, p_date) > g_max_length_of_service THEN RAISE_APPLICATION_ERROR(-20202, 'Varsta de pensionare'); END IF; END check_data_angajarii;

b.

c.

d.

END check_ang_pkg; EX. Care este varianta corect pentru a defini doi vectori avand dimensiunea maxim 3, iniializai prin liste de valori, i un al treilea, care va avea ca elemente, produsul pe componente a celor doi vectori? a. DECLARE TYPE vector IS VARRAY(3) OF NUMBER v_1 vector :=vector(1,2,3); v_2 vector :=vector(100,200,300) v_produs vector :=vector(); BEGIN FOR i in 1..3 LOOP v_produs(i)* v_2(i) END LOOP; END DECLARE TYPE vector IS VARRAY(3) OF NUMBER v_1 vector :=vector(1,2,3); v_2 vector :=(100,200,300) v_produs vector:=vector(); BEGIN FOR i in 1..3 LOOP v_produs.EXTEND; v_produs(i):=v_1(i)* v_2(i); END LOOP; END DECLARE TYPE vector IS VARRAY(3) OF NUMBER v_1 vector:=vector(1,2,3); v_2 vector:=vector(100,200,300) v_produs vector:=vector(); BEGIN FOR i in 1:3 LOOP v_produs(i) :=v_produs(i)* v_1(i)* v_2(i) END LOOP; END

b.

c.

37. Care dintre urmatoarele afirmatii nu este corecta? a. b. c. d. Un trigger poate fi redenumit utilizand o comanda ALTER TRIGGER. Dupa ce este definit, triggerul devine activ si va fi executat ori de cate ori au loc operatiile declansatoare asociate acestuia. Un trigger poate fi recompilat utilizand o comanda ALTER TRIGGER. Un trigger la nivel de linie este executat o singura data, indiferent de numarul de linii afectate de comanda declansatoare. Care dintre urmatoarele afirmatii este corecta?

38.

a. b. c. d.

Blocul PL/SQL care descrie actiunea unui trigger nu poate contine comanda COMIT. Corpul unui trigger nu poate contine comenzi LMD. Atunci cand un tabel este sters, triggeri asociati acestuia sunt dezactivati automat, nefiind eliminati. In clauza ON din definitia unui trigger pot fi specificate mai multe tabele sau vizualizari.

2. Care din urmatoarele declaratii de valabilitate este corecta? a. v_id_student v_nume_student v_prenume_student v_data v_id_student v_nume_student v_prenume_student v_data v_id_student v_nume_student v_prenume_student v_data NUMBER(5); VARCHAR2(35) NOT NUL:=Ionescu; CHAR(20); DATE DEFAULT SYSDATE; NUMBER(5); VARCHAR2(35) NOT NUL:=Ionescu; studenti.prenume%TYPE; DATE:=SYSDATE+1; NUMBER(2):=150; studenti.nume%ROWTYPE:=Ionescu; CHAR(20); DATE:=SYSDATE+1;

b.

c.

32. Care tabel/vizualizare poate fi folosit/folosita in urmatoarea comanda pentru a obtine informatii despre procedurile si functiile detinute de utilizatorul curent? SELECT * FROM .. WHERE OBJECT_TYPE IN (PROCEDURE , FUNCTION);

a. b. c. d.

USER_SOURCE DUAL USER_ERRORS USER_OBJECTS

15. Ce comanda SQL*Plus ar putea sa preceada blocul de mai jos pentru ca in acesta sa se utilizeze valoarea data variabilei sem? DECLARE v_sem CHAR(2):=UPPER(&sem);

BEGIN CASE v_sem WHEN I THEN DBMS_OUTPUT.PUT_LINE(SEMESTRUL I); WHEN II THEN DBMS_OUTPUT.PUT_LINE(SEMESTRUL II); ELSE DBMS_OUTPUT.PUT_LINE(este o eroare!); END CASE; END; a. b. c. d. ACCEPT sem PROMPT sem= VARIABLE sem=li DEFINE sem TYPE SEM=i

EX. Ce se va afisa in urma executiei urmatorului bloc? SQL> DEFINE p_a = 'xxx'SQL> DECLARE 2 v_a CHAR(3) := UPPER('&p_a'); 3 BEGIN 4 CASE v_a 5 WHEN 'UB' THEN DBMS_OUTPUT.PUT_LINE('Univ. Bucuresti'); 6 WHEN 'USH' THEN DBMS_OUTPUT.PUT_LINE('Univ. Spiru Haret'); 7 ELSE DBMS_OUTPUT.PUT_LINE('Este o eroare!'); 8 END CASE; 9 END; 10 / a. b. c. d. Univ. Bucuresti Univ. Spiru Haret Eroare intoarsa de sistem Este o eroare

EX. 30 Ce trebuie adaugat la linia 9 pentru ca urmatoarea functie sa fie corect creata? 1 CREATE OR REPLACE FUNCTION nr_sal (v_dept NUMBER) 2 RETURN NUMBER IS3 v_numar NUMBER (3); 4 BEGIN 5 SELECT COUNT(*) 6 INTO v_numar 7 FROM angajati 8 WHERE id_departament = v_dept; 9 .. 10 END nr_sal;

a. b. c. d.

DBMS _OUTPUT.PUT_LINE(v_numar); COMMIT; nu mai trebuie adaugat nimic RETURN v_numar

35. Ce trebuie adaugat la linia 11 pentru ca in urmatorul bloc PL/SQL sa se foloseasca corect cursorul? 1 2 3 4 5 6 7 8 9 10 11 12 13 a. b. c. d. DECLARE CURSOR c_ang IS SELECT * FROM angajati WHERE TO_CHAR(data_angajarii,YYYY)=2000 FOR UPDATE OF salariu NOWAIT; BEGIN FOR v_c_ang IN c_ang LOOP UPDATE angajati SET salariu=salariu+1000 .. END LOOP; END;

END UPDATE; WHERE CURRENT OF c_ang; FOR EACH ROW EXIT WHEN c_ang%NOTFOUND;

EX. Codul urmtor: DECLARE PROCEDURE p1(val NUMBER) IS BEGIN UPDATE angajai SET salariu=salariu+val WHERE cod_departament=10; END; BEGIN p1(700); END a. b. c. d. declar o procedura stocat cu un parametru de tip IN declar o procedura stocat cu un parametru de tip OUT declar o procedura local cu un parametru de tip IN conine erori

33. Codul sursa de mai jos defineste un pachet cu ajutorul caruia, utilizand un subprogram functie si un cursor, se poate obtine salariul minim inregistrat pentru angajati si lista angajatilor care au salariul mai mare sau egal decat acel minim +1000. CREATE OR REPLACE PACKAGE pachet_min_sal AS CURSOR c_ang(nr NUMBER) RETURN angajati % ROWTYPE; FUNCTION f_min RETURN NUMBER ; END pachet_min_sal; CREATE OR REPLACE PACKAGE BODY pachet_min_sal AS CURSOR c_ang(nr NUMBER) RETURN angajati % ROWTYPE IS SELECT * FROM angajati WHERE salariu >nr+1000; FUNCTION f_min RETURN NUMBER IS minim NUMBER ; BEGIN SELECT Min(salariu) INTO minim FROM angajati; RETURN minim; END f_min; END pachet_min_sal; Care este varianta corecta de apelare pentru a obtine lista dorita?

a.

b.

DECLARE val_min NUMBER ; BEGIN val_min:=pachet_min_sal.f_min; DBMS_OUTPUT.PUT_LINE(Salariul minim || || val_min); FORv_cursor IN pachet_min_sal .c_ang(val_min)LOOP DBMS_OUTPUT.PUT_LINE(v_cursor.nume|| || v_cursor.salariu); END LOOP; END; DECLARE val_min NUMBER ; BEGIN DBMS_OUTPUT.PUT_LINE(Salariul minim || || val_min); FORv_cursor IN pachet_min_sal .c_ang(val_min)LOOP DBMS_OUTPUT.PUT_LINE(v_cursor.nume|| || v_cursor.salariu); END LOOP; END;

c.

DECLARE val_min NUMBER ; BEGIN val_min:=pachet_min_sal.f_min; DBMS_OUTPUT.PUT_LINE(Salariul minim || || val_min); FORv_cursor IN pachet_min_sal .c_ang(val_min) DBMS_OUTPUT.PUT_LINE(v_cursor.nume|| || v_cursor.salariu); END; In blocul PL/SQL de mai jos VARIABLE rows_deleted VARCHAR(20) DECLARE v_dep_id angajati.id_departament%TYPE:=80; BEGIN DELETE FROM angajati WERE id_departament=v_dep_id; :rows_deleted:=SQL%ROWCOUNT||rows deleted; END; / PRINT rows_deleted apare:

36.

a. b. c. d.

un cursor explicit nu apare nici un cursor un cursor implicit un ciclu cursor cu subcereri

EX. In urmatorul bloc PL/SQL se declara variabila v_job de tipul coloanei nume_job din tabelul joburi, a carei valoare este numele jobului salariatului avand codul 200. Pentru ca acest bloc sa fie corect trebuie adaugat la linia 7 urmatorul cod:

SQL> DECLARE 2 v_job joburi.nume_job%TYPE; 3 BEGIN 4 SELECT nume_job 5 INTO v_job 6 FROM angajati a, joburi j 7 8 DBMS_OUTPUT.PUT_LINE('jobul este '|| v_job); 9 END;

a. b. c. d.

WHERE id_angajat=200; WHERE v_job.id_job=j.id_job AND id_angajat=200; WHERE a.id_job=j.id_job AND id_angajat=200; WHERE a.job_id=v_job.id_job AND id_angajat=200;

EX. Pachetul ang_pkg, a carui spacificatie este data mai jos, contine trei proceduri overload, denumite gasire_ang. Parametrii lor de intrare sunt de diferite tipuri de date. CREATE OR REPLACE PACKAGE ang_pkg IS PROCEDURE gasire_ang(p_id_angajat IN NUMBER, p_nume OUT VARCHAR2); -- 1 PROCEDURE gasire_ang(p_id_job IN VARCHAR2, p_nume OUT VARCHAR2); -- 2 PROCEDURE gasire_ang(p_data_angajarii IN DATE, p_nume OUT VARCHAR2); -- 3 END ang_pkg; Care varianta este corecta pentru a executa procedura 2? a. b. c. d. DECLARE v_nume VARCHAR2(30);BEGIN ang_pkg.gasire_ang(100, v_nume);END; DECLARE v_nume VARCHAR2(30);BEGIN ang_pkg.gasire_ang('IT_PROG', v_nume);END; BEGIN ang_pkg.gasire_ang('IT_PROG', v_nume);END; DECLARE v_nume VARCHAR2(30);BEGIN ang_pkg.gasire_ang(sysdate, v_nume);END;

11. Pentru ca urmatorul bloc PL/SQL sa fie corect trebuie adaugat la linia 8 urmatorul cod: SQL > DECLARE 2 TYPE ang_record_type IS RECORD ( 3 nume VARCHAR2(20), 4 departament NUMBER); 5 ang_record ang_record_type; 6 BEGIN 7 SELECT nume, id_departament

8 9 11 || 13 14 a. b. c. d.

FROM angajati WHERE id_angajat = 100; DBMS_OUTPUT.PUT_LINE (Nume || ang_record.nume || Departament ang_record.departament); END; INTO ang_record_type%type INTO ang_record_type%rowtype INTO ang_record_type INTO ang_record

12. Pentru ca urmatorul bloc PL/SQL sa fie corect si sa afiseze codul, salariatul si jobul angajatului cu codul 100, trebuie adaugat la linia 10 urmatorul cod: SQL> DECLARE 2 TYPE type_ang IS RECORD ( 3 ang_cod angajati.id_angajat%TYPE, 4 sal angajati.salariu%TYPE, 5 job angajati.id_job%TYPE); 6 v_ang type_ang; 7 BEGIN 8 DELETE FROM angajati 9 WHERE id_angajat=100 10 11 INTO v_ang; 12 DBMS_OUTPUT.PUT_LINE ( Angajatul cu codul :|| v_ang.ang_cod || 13 si jobul || v_ang.job || are salariul || v_ang.sal); 14 END; a. b. c. d. RETURNING angajati%rowtype RETURNING id_angajat, RETURNING salariu, RETURNING id_job RETURNING id_angajat, salariu, id_job RETURNING v_ang

EX.12 Pentru ca urmatorul bloc PL/SQL sa fie corect si sa afiseze codul, salariul si jobul angajatului cu codul 100, trebuie adaugat la linia 8 urmatorul cod: SQL> DECLARE 2 TYPE typeang IS RECORD ( cod angajati.id_angajat%TYPE, 3 sal angajati.salariu%TYPE, job angajati.id_job%TYPE); 4 v_ang typeang; 5 BEGIN 6 DELETE FROM angajati 7 WHERE id_angajat=100 8 .. 9 INTO v_ang;

10 DBMS_OUTPUT.PUT_LINE (' Angajatul cu codul :'|| v_ang.cod || 11 ' si jobul ' || v_ang.job || ' are salariul ' || v_ang.sal); 12 END;

a. b. c. d.

RETURNING id_angajat, RETURNING salariu, RETURNING id_job RETURNING id_angajat, salariu, id_job RETURNING v_ang NIMIC

13. Pentru ca urmatorul bloc PL/SQL sa fie corect trebuie adaugat la linia 6 urmatorul cod: 1 2 3 4 5 6 7 8 9 a. b. c. d. DECLARE TYPE typetablou IS TABLE OF NUMBER; tablou typetablou:= typetablou(); BEGIN FOR i IN 1..10 LOOP tablou(i) :=i; END LOOP; END;

tablou.EXTEND; tablou:= typetablou(); tablou(i):= typetablou(); tablou(i).NEXT;

27. a. b. c. d.

Parametrii unei functii pot fi: De intrare (IN), de intrare/iesire (IN/OUT) sau de iesire (OUT) Numai de intrare (IN) Numai de iesire (OUT) De intrare (IN) sau de iesire (OUT)

EX.31 10%.

Se da functia de mai jos, care permite calcularea unui impozit pe salariu de

CREATE FUNCTION impozit(p_value IN NUMBER)RETURN NUMBER IS BEGIN RETURN (p_value * 0.1); END impozit; Care este sintaxa corecta pentru a apela acesta functie? a. SELECT id_angajat, nume, salariu, impozit tax FROM angajati WHERE id_departament = 50; VARIABLE tax:=impozit(salariu)SELECT id_angajat, nume, salariu, taxFROM angajati WHERE id_departament = 50; SELECT id_angajat, nume, salariu, impozit(salariu) tax FROM angajati WHERE id_departament = 50; DECLARE :tax NUMBERBEGIN:tax:=impozit(salariu)PRINT tax END;

b.

c.

d.

EX. .Se da procedura de mai jos, care afla pentru un anume angajat numele si salariul acestuia. CREATE OR REPLACE PROCEDURE p_ang (p_id IN angajati.id_angajat%TYPE, p_nume OUT angajati.nume%TYPE, p_salariu OUT angajati.salariu%TYPE) ISBEGIN SELECT nume,salariu INTO p_nume, p_salariu FROM angajati WHERE id_angajat = p_id; END p_ang; Care este sintaxa corecta pentru a apela acesta procedura? a. DECLAREa_ang_nume angajati.nume%TYPE; a_ang_sal angajati.salariu%TYPE; BEGIN p_ang(180, a_ang_nume, a_ang_sal); END VARIABLEa_ang_nume nume%TYPE; a_ang_sal angajati.salariu; BEGINp_ang(180, a_emp_name, a_emp_sal); END; BEGINp_ang(180, Grant, 2600); END;

b.

c.

EX. Se da urmatorul bloc PL/SQL: DECLARE v_numar NUMBER; v_boolean BOOLEAN; BEGIN v_numar := 25; v_boolean := NOT(v_numar > 30); END; Care dintre urmatoarele afirmatii este adevarata?

a. b. c. d.

Executia blocului se incheie cu o eroare, deoarece variabila v_boolean nu este initializata la declarare. In urma executiei blocului variabila v_boolean va avea valoarea true. In urma executiei blocului variabila v_boolean va avea valoarea false. Executia blocului se incheie cu o eroare, deoarece pentru variabila v_numar nu este specificata dimensiunea maxima.

EX. Se da urmatorul bloc PL/SQL: DECLARE v_numar NUMBER; v_boolean BOOLEAN; BEGIN v_numar := 25; v_boolean := NOT(v_numar > 30); END; Care dintre urmatoarele afirmatii este adevarata?

a. b. c. d.

Executia blocului se incheie cu o eroare, deoarece variabila v_boolean nu este initializata la declarare. In urma executiei blocului variabila v_boolean va avea valoarea true. In urma executiei blocului variabila v_boolean va avea valoarea false. Executia blocului se incheie cu o eroare, deoarece pentru variabila v_numar nu este specificata dimensiunea maxima.

20[2]. Se da urmatorul bloc PL/SQL: DECLARE TYPE t_ang IS RECORD( cod angajati id_angajat%TYPE, sal angajati.salariu%TYPE, Job angajati id_job%TYPE); v_ang t_ang ; BEGIN

SELECT id_angajat, salariu. Id_job INTO v_ang FROM angajati WHERE id_angajat=100; DBMS_OUTPUT_LINE('Angalatul cu codul'|| v_ang.cod|| are salariul in valoare || v_ang sal); END; Stiind ca in tabelul angajati exista angajatul cu codul 100 care are un salariu de 5000 care din urmatoarele afirmatii sunt adevarate? a. b. c. d. Executia blocului se incheie cu o eroare, deoarece comanda SELECT altereaza coloana if_job care.. Clauza INTO v_ang a comenzii SELECT poate fi inlocuita cu clauza INTO v_ang.sal v_ang... Declararea v_ang este pornita in partea de declaratii a blocului PL/SQL Blocul se executa fara erori si afiseaza ... Angajatul cu codul 100 are salariul in valoare de 5000

3. Se da urmatorul bloc PL/SQL: DECLARE carte VARCHAR2(20); autor VARCHAR(15) DEFAULT 'Eminescu' ; BEGIN DBMS_OUTPUT.PUT_LINE(carte||' '||autor); END; Care din urmatoarele afirmatii este corecta? a. b. c. d. 4. Se va returna o eroare, deoarece variabila carte este utilizata nefiind initializata. Se va returna o eroare, deoarece nu se poate utiliza clauza DEFAULT pentru a initializa o variabila de tip VARCHAR2. Blocul se executa fara erori si afiseaza 'null Eminescu'. Blocul se executa fara erori si afiseaza 'Eminescu' Se da urmatorul bloc PL/SQL:

DECLARE nume VARCHAR2(15); v_nr INTEGER; BEGIN SELECT LENGTH(nume) INTO v_nr

FROM dual; DBMS_OUTPUT.PUT_LINE('Sirul are '||v_nr||'caractere'); END; Care din urmatoarele afirmatii este adevarata? a. b. c. d. Va fi generata o eroare deoarece variabila nume este utilizata nefiind initializata. Blocul se executa fara erori si afisaza 'Sirul are 0 caractere'). Blocul se executa fara erori si afisaza 'Sirul are caractere'). Va fi generata o eroare deoarece variabila v_nr este utilizata nefiind initializata

5.

Se da urmatorul bloc PL/SQL

DECLARE v_salariu NUMBER(8):=&p_salariu; v_bonus NUMBER(8); v_salariu_anual NUMBER(8); BEGIN v_salariu_anual:=v_salariu*12; IF v_salariu_anual>=20000 THEN v_bonus:=0.01 * v_salariu_anual; ELSIF v_salariu_anual >10000 AND v_salariu_anual <20000 THEN v_bonus:=0.02* v_salariu_anual; ELSE v_bonus:=100; END IF; DBMS_OUTPUT.PUT_LINE(Bonusul este'|| v_bonus); END; Care din urmatoarele afirmatii nu este corecta? a. b. c. Blocul genereaza o eroare, deoarece variabila p_salariu nu este initializata. Variabila p_salariu reprezinta o variabila de substitutie, a carei valoare poate fi data prin utilizarea comenzii DEFINE din SQL*PLUS. Blocul se executa fara erori, asteptandu-se introducerea de la tastatura a unei valori pentru variabila p_salariu,daca nu a fost deja data o valoare pentru aceasta. Daca valoarea variabilei v-salariu este 500, atunci blocul se executa fara erori si afiseaza textul 'Bonusul este 100'.

d.

EX. 6 Se da urmatorul bloc PL/SQL: BEGIN SELECT nume_job INTO :rezultat FROM angajati a, joburi b WHERE a.id_job=b.id_job AND id_angajat=100;

DBMS_OUTPUT.PUT_LINE('Numele jobului este '|| :rezultat); END; Care dintre urmatoarele afirmatii este adevarata? a. b. c. d. Blocul se executa fara erori si afiseaza numele jobului angajatului avand codul 100. Valoarea variabilei de legatura rezultat nu poate fi afisata decat din interiorul blocului PL/SQL. Executia blocului se incheie cu o eroare, deoarece utilizarea clauzei INTO a comenzii SELECT nu este corecta. Executia blocului se incheie cu o eroare, deoarece variabila de legatura rezultat nu este declarata in afara blocului PL/SQL. Se da urmatorul bloc PL/SQL:

7.

DECLARE v_cod_sal angajati.id_angajat%TYPE:= 100; v_cod_dept angajati.id_departament%TYPE:= 10; v_procent NUMBER(8):=20; BEGIN UPDATE angajati SET id_departament = v_cod_dept, salariu=salariu + (salariu* v_procent/100) WHERE id_angajat = v_cod_sal; IF SQL%ROWCOUNT = 0 THEN DBMS_OUTPUT.PUT_LINE (Nu exista un angajat cu acest cod); ELSE COMMIT; DBMS_OUTPUT.PUT_LINE (Actualizare realizata); END IF; END; Care dintre urmatoarele afirmatii este adevarata? a. b. c. d. Executia blocului se incheie cu o eroare, deoarece comanda clauza SET a comenzii UPDATE este utilizata gresit. Executia blocului se incheie cu o eroare, deoarece comanda COMMIT nu poate fi utilizata intr-un bloc PL/SQL. Executia blocului se incheie cu o eroare, deoarece metoda ROWCOUNT este utilizata pentru un cursor nedeclarat. Blocul se va executa fara erori si afiseaza mesajul Nu exista un angajat cu acest cod daca angajatul avand codul 100 nu exista in tabelul angajati sau mesajul Actualizare realizata in caz contrar.

26.

Se da urmatorul bloc PL/SQL:

DECLARE v_nume angajati.nume%TYPE; v_data angajati.data_angajarii%TYPE; CURSOR c IS SELECT nume, data_angajarii FROM angajati; BEGIN OPEN c; LOOP INSERT INTO informatii (nume_angajat, data_angajarii) VALUES (v_nume, v_data); EXIT WHEN c%NOTFOUND; END LOOP; COMMIT; END; Care dintre urmatoarele afirmatii este adevarata? a. b. c. d. Blocul se executa fara erori, introducandu-se in tabelul informatii o linie cu toate valorile null , respectiv toate liniile din tabelul angajati Executia blocului se incheie cu o eroare, deoarece cursorul c nu este inchis dupa ce este utilizat Executia blocului se incheie cu o eroare, deoarece utilizarea comenzii COMMIT nu este permisa in interiorul unui bloc PL/SQL Blocul se executa fara erori, introducandu-se in tabelul informatii toate liniile din tabelul angajati Se da urmatorul bloc PL/SQL

17.

DECLARE
TYPE tabimb IS TABLE OF VARCHAR2(50); tab1 tabimb; tab2 tabimb:= tabimb (); BEGIN IF tab1 IS NULL THEN DBMS_OUTPUT.PUT_LINE(tab1 este NULL); ELSE DBMS_OUTPUT.PUT_LINE(tab1 este NOT NULL); END IF; IF tab2 IS NULL THEN DBMS_OUTPUT.PUT_LINE(tab2 este NULL); ELSE

DBMS_OUTPUT.PUT_LINE(tab2 este NOT NULL); END IF; END; In urma executiei acestui bloc se obtine urmatorul rezultat: a. b. c. d. tab1 este NOT NULL tab2 este NOT NULL tab1 este NULL tab2 este NOT NULL EROARE tab1 este NULL tab2 este NULL

EX. Se da urmatorul bloc PL/SQL: DECLARE nr NUMBER(4) ; suma NUMBER(4); info VARCHAR2(50) ; BEGIN nr:=0 ; FOR i IN (SELECT nume_departament nd, nume n, salariu FROM departmente d, angajati a WHERE a.id department(+) = d.id department AND a.id_departament IS NULL) LOOP nr:=nr+1; info :=i.nd| | | |i.n; suma:=suma+ i.salariu; END LOOP; DBMS_OUTPUT.PUT_LINE(nr); DBMS_OUTPUT.PUT_LINE(suma); DBMS_OUTPUT.PUT_LINE(info); END; In urma executiei acestui bloc a. b.
apare o eroare variabila nr va avea ca valoare numarul de departamente in care nu lucreaza angajati; variabila suma va avea valoarea null; variabila info va mentine informatii corespunzatoare ultimei linii intoarse de comanda SELECT. variabila nr va avea ca valoare numarul total de angajati; variabila suma va avea valoarea null; variabila info va mentine informatii corespunzatoare tuturor liniilor intoarse de comanda SELECT variabila nr va avea ca valoare numarul total de departamente in care lucreaza angajati; variabila suma ca valoare suma salariilor tuturor angajatilor;

c.

d.

variabila info va mentine informatii corespunzatoare primei linii intoarse de comanda SELECT.

EX. Se da urmatorul bloc PL/SQL DECLARE TYPE typetablou IS TABLE OF NUMBER; tablou typetablou:= typetablou(); BEGIN FOR i IN 1..10 LOOP tablou.EXTEND; tablou(i) :=i; END LOOP; DBMS_OUTPUT.PUT_LINE('tabloul are ' || tablou.COUNT || ' elemente'); FOR i IN tablou.FIRST..tablou.LAST LOOP tablou(i) := NULL; END LOOP; DBMS_OUTPUT.PUT_LINE('tabloul are ' || tablou.COUNT || ' elemente'); tablou.TRIM(tablou.COUNT); DBMS_OUTPUT.PUT_LINE('tabloul are ' || tablou.COUNT || ' elemente'); END; In urma executiei blocului se obtine urmatorul rezultat: a. Tabloul are 10 elemente Tabloul are 10 elemente Tabloul are 0 elemente Nu afiseaza nimic Tabloul are 10 elemente Tabloul are 0 elemente Tabloul are 0 elemente eroare Se da urmatorul bloc PL/SQL

b. c.

d. 18.

DECLARE TYPE tablou_numar IS TABLE OF NUMBER INDEX BY PLS_INTEGER; v_tablou tablou_numar; BEGIN FOR i IN 1...10 LOOP v_tablour(i) := i*i*i; END LOOP; FOR i IN v_tablou.FIRST..v_tablou.LAST LOOP v_tablour(i) := NULL; END LOOP; DBMS_OUTPUT.PUT_LINE(tabloul are || v_tablou.COUNT || elemente);

v_tablou.delete; DBMS_OUTPUT.PUT_LINE(tabloul are || v_tablou.COUNT || elemente); END; In urma executiei blocului se obtine urmatorul rezultat: a. b. c. d. tabloul are 10 elemente tabloul are 10 elemente Eroare tabloul are 10 elemente tabloul are 0 elemente tabloul are 0 elemente tabloul are 0 elemente

EX. Se da urmatorul corp de pachet, care contine doua proceduri overload denumite add_dept. CREATE OR REPLACE PACKAGE BODY dept_pkg IS PROCEDURE add_dept(p_dept NUMBER, p_nume VARCHAR2:=unknown) IS1 BEGIN INSERT INTO departamente(id_departament,nume_departament) VALUES (p_dept, p_nume) END add_dept; PROCEDURE add_dept (p_nume VARCHAR:=unknown) IS2 BEGIN INSERT INTO departamente (id_departament,nume_departament) VALUES (departamente_seq.NEXTVAL, p_nume); END add_dept; END dept_pkg; Care varianta este corecta pentru a executa procedura 2? a. BEGIN dept_pkg.add_dept(Training); END; BEGIN Dept_pkg.add_dept(100,Training); END; Eroare, nu apeleaza nici o procedura BEGIN Dept_pkg.add_dept (Training,100);

b.

c. d.

16. Sa se introduca in tabelul testare(cod NUMBER(2)) 5 inregistrari, avand codurile egale cu 1, 2, 3, 4 respectiv 5. Care din urmatoarele variante nu executa acest deziderat? a. DECLARE v_contor NUMBER(2) := 1; BEGIN LOOP INSERT INTO testare VALUES (v_contor); v_contor :=v_contor + 1; EXIT WHEN v_contor > 5; END LOOP; END; b. DECLARE v_contor NUMBER(2) := 1; BEGIN WHILE v_contor < 6 LOOP INSERT INTO testare VALUES (v_contor); v_contor :=v_contor + 1; END LOOP; END; c. DECLARE v_contor NUMBER(2) := 1; BEGIN FOR i IN 1..5 LOOP INSERT INTO testare VALUES (v_contor); END LOOP; END; d. BEGIN FOR i IN 1..5 LOOP INSERT INTO testare VALUES (i); END LOOP; END; 41. Se defineste un trigger care determina inserarea unei linii in tabelul angajati_log atunci cand salariul unui angajat este marit. Care dintre urmatoarele variante este corecta? a. CREATE TRIGGER trigger_salariu AFTER UPDATE OF salariu ON angajati FOR EACH ROW BEGIN IF :NEW.salariu>:OLD.salariu THEN INSERT INTO angajati_log (utilizator, data, angajat, salariu_vechi, salariu_nou) VALUES (USER, SYSDATE, :OLD.id_angajat, :OLD.salariu, :NEW.salariu); END IF;

b.

c.

END; CREATE TRIGGER trigger_salariu AFTER UPDATE OF salariu ON angajati WHEN (:NEW.salariu>:OLD.salariu) BEGIN INSERT INTO angajati_log (utilizator, data, angajat, salariu_vechi, salariu_nou) VALUES (USER, SYSDATE, :OLD.id_angajat, :OLD.salariu, :NEW.salariu); END; CREATE TRIGGER trigger_salariu BEFORE UPDATE OF salariu ON angajati_log FOR EACH ROW BEGIN IF NEW.salariu>OLD.salariu THEN INSERT INTO angajati_log (utilizator, data, angajat, salariu_vechi, salariu_nou) VALUES (USER, SYSDATE, :OLD.id_angajat, :OLD.salariu, :NEW.salariu); END IF; END;

39. Se presupune ca asupra tabelului angajati au fost definiti urmatorii 4 triggeri LMD: - trigger 1 de tip BEFORE INSERT la nivel de comanda; - trigger 2 de tip BEFORE UPDATE la nivel de comanda; - trigger 3 de tip AFTER UPDATE la nivel de linie; - trigger 4 de tip AFTER DELETE la nivel de comanda. O comanda UPDATE actualizeaza 3 inregistrari din tabelul angajati. In acest caz, de cate ori este executat fiecare trigger (in dreptul numelui triggerului este trecut numar de executii al acestuia)? a. Trigger1 - 1 Trigger2 - 1 Trigger3 - 3 Trigger4 - 1 Trigger1 - 0 Trigger2 - 3 Trigger3 - 3 Trigger4 - 0 Trigger1 - 0 Trigger2 - 1 Trigger3 3 Trigger4 - 0

b.

c.

42. Se presupune ca a fost creat tabelul dept(id_depatament, nr_angajati), care mentine pentru fiecare departament numarul de angajati care lucreaza in acesta. Prin comanda urmatoare se defineste vizualizarea view_angajati: CREATE VIEW view_angajati AS SELECT id_angajat, nume, prenume, id_departament FROM angajati; Care este varianta corecta prin care se defineste un trigger care va determina incrementarea cu 1 a numarului de angajati din tabelul dept daca in vizualizare este inserata o inregistrare, respective decrementarea cu 1 a numarului de angajati din tabelul dept daca din vizualizare este stearsa o inregistrare? a. CREATE TRIGGER trig_dept INSTEAD OF INSERT OR DELETE ON view_angajati BEGIN IF INSERTING THEN UPDATE dept SET nr_angajati = nr_angajati +1; ELSE UPDATE dept SET nr_angajati = nr_angajati -1; END IF;END; CREATE TRIGGER trig_dept INSTEAD OF INSERT OR DELETE ON view_angajati FOR EACH ROW BEGIN IF INSERTING THEN UPDATE dept SET nr_angajati = nr_angajati +1; WHERE id_departament = :NEW.id_departament; ELSE UPDATE dept SET nr_angajati = nr_angajati -1; WHERE id_departament = :OLD.id_departament; END IF;END; CREATE TRIGGER trig_dept AFTER INSERT OR DELETE ON view_angajati FOR EACH ROW BEGIN IF INSERTING THEN UPDATE dept SET nr_angajati = nr_angajati +1; WHERE id_departament = :NEW.id_departament; ELSE UPDATE dept SET nr_angajati = nr_angajati -1; WHERE id_departament = :OLD.id_departament; END IF;END;

b.

c.

44. Se presupune c ntr-o sal a unui muzeu pot fi expuse maximum 10 opere de art. Pentru aceasta se creeaz urmtorul trigger: CREATE TRIGGER trigger_opere BEFORE INSERT OR UPDATE OF cod_sala ON opera FOR EACH ROW DECLARE v_max NUMBER := 10; v_nr NUMBER; BEGIN SELECT COUNT(*) INTO v_nr FROM opera WHERE cod_sala =:NEW.cod_sala; IF v_nr + 1>v_max THEN RAISE_APPLICATION_ERROR(-20000,Prea multe opere de arta); END IF; END; Care dintre urmatoarele variante este corecta? a. Triggerul este creat fara erori la compilare si va functiona corect pentru toate comenzile LMD utilizate asupra tabelului opera. b. Aceasta conditie poate fi implementata prin adaugarea unei constrangeri de tip CHECK asupra tabelului opera. c. Triggerul este creat cu erori la compilare d. Triggerul este creat fara erori la compilare, dar in cazul anumitor comenzi LMD asupra tabelului opera va genera eroarea table mutating. 43. Urmatoarea comanda creaza tabelul audit: CREATE TABLE audit (actiune VARCHAR2(20), utilizator VARCHAR2(30) DEFAULT USER, data DATE DEFAULT SYSDATE); Apoi, este definit urmatorul trigger: CREATE TRIGGER trig_audit AFTER ALTER ON SCHEMA BEGIN INSERT INTO audit(actiune) VALUES(Obiect modificat); END;

Care dintre actiunile urmatoare va determina declansarea triggerului creat si inserarea unei inregistrari in tabelul audit? a. b. c. d. O comanda prin care se adauga o constrangere de cheie primara unui table existent. O comanda prin care se modifica valorile unor inregistrari dintr-un tabel. O comanda prin care se creaza un tabel. O comanda prin care se eliminaun index.

8.

Variabila g_mesaj declarata ca mai jos este:

VARIABLE g_mesaj VARCHAR2 (50) BEGIN :g_mesaj := Invat PL/SQL; END; a. b. c. d. Variabila de substitutie. De tip record. Variabila de legatura. De tip varray.

1. Care nu este varianta corecta de cod PL/SQL care sterge din tabelul joburi, joburile pentru care salariul minim este 4000 sau 8200, daca aceste valori sunt mentinute intr-un vector? a. DECLARE TYPE min_sal IS VARRAY(20) OF NUMBER; v_min_sal min_sal:= min_sal(4000,8200); BEGIN FOR i IN v_min_sal.FIRST..v_min_sal.LAST LOOP DELETE FROM joburi WHERE salariu_min = v_min_sal(i); END LOOP; END;

b. DECLARE TYPE min_sal IS VARRAY(20) OF NUMBER; v_min_sal min_sal:= min_sal(4000,8200); BEGIN FORALL i IN v_min_sal.FIRST..v_min_sal.LAST DELETE FROM joburi WHERE salariu_min = v_min_sal(i); END;

c. DECLARE TYPE min_sal IS VARRAY(20) OF NUMBER; v_min_sal min_sal; BEGIN FORALL i IN v_min_sal.FIRST..v_min_sal.LAST DELETE FROM joburi WHERE salariu_min = v_min_sal(i); END;

2. Care este varianta corecta pentru declararea urmatoarelor variabil a.

c_valoare CONSTANT NUMBER; v_cod_dep departamente.id_departament%TYPE; v_dep departamente%ROWTYPE :=10,'Vanzari',101,'Bucuresti';

b. c_valoare CONSTANT NUMBER := 1000; v_cod_dep departamente%TYPE; v_ang angajati%ROWTYPE;

c. c_valoare CONSTANT NUMBER := 1000; v_cod_dep departamente.id_departament%TYPE; v_dep departamente%ROWTYPE;

3. Care este varianta corecta pentru afisarea variabilei v_mesaj? a. VARIABLE v_mesaj VARCHAR2(50) BEGIN :v_mesaj := ' Invat PL/SQL '; END; / PRINT &v_mesaj b. VARIABLE v_mesaj VARCHAR2(50) BEGIN :v_mesaj := ' Invat PL/SQL '; PRINT v_mesaj; END; /

c. VARIABLE v_mesaj VARCHAR2(50) BEGIN :v_mesaj := ' Invat PL/SQL '; DBMS_OUTPUT.PUT_LINE(:v_mesaj);

END; /

4 Care este varianta incorecta prin care se afiseaza numele si prenumele primelor 5 persoane angajate in luna martie in anul 1997? a. DECLARE v_nume angajati.nume%TYPE; v_prenume angajati.prenume%TYPE; CURSOR c IS SELECT nume, prenume FROM angajati WHERE TO_CHAR(data_angajarii,'MM-YYYY') = '03-1997' ORDER BY data_angajarii; BEGIN OPEN c; LOOP FETCH c INTO v_nume,v_prenume; EXIT WHEN c%ROWCOUNT>5 OR c%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_nume || ' '||v_prenume); END LOOP; CLOSE c; END;

b. DECLARE CURSOR c IS SELECT nume v_nume, prenume v_prenume FROM angajati WHERE TO_CHAR(data_angajarii,'MM-YYYY') ='03-1997' ORDER BY data_angajarii ASC; BEGIN FOR i IN c LOOP DBMS_OUTPUT.PUT_LINE(c.v_nume || ' '||c.v_prenume); END LOOP; END;

c. BEGIN FOR c IN (SELECT * FROM ( SELECT nume v_nume, prenume v_prenume FROM angajati

WHERE TO_CHAR(data_angajarii,'MM-YYYY') = '03-1997' ORDER BY data_angajarii DESC) WHERE ROWNUM<=5) LOOP DBMS_OUTPUT.PUT_LINE(c.v_nume || ' '||c.v_prenume); END LOOP; END;

5.Care este varianta corecta pentru crearea unui cursor explicit care sa afiseze, ID-ul, numele si salariul angajatilor care lucreaza in departamentul 30? a. DECLARE CURSOR ang_cursor IS SELECT nume, salariu FROM angajati WHERE id_departament =30; v_ang_id angajati.id_angajat%TYPE; v_nume angajati.nume%TYPE; v_sal angajati.salariu%TYPE; BEGIN OPEN ang_cursor; LOOP FETCH ang_cursor INTO v_ang_id, v_nume, v_sal; EXIT WHEN ang_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE( v_nume||' '||v_sal); END LOOP; END; b. DECLARE CURSOR ang_cursor IS SELECT id_angajat, nume, salariu FROM angajati WHERE id_departament =30; v_nume angajati.nume%TYPE; v_sal angajati.salariu%TYPE; BEGIN OPEN ang_cursor; LOOP FETCH ang_cursor INTO v_nume, v_sal; EXIT WHEN ang_cursor%NOTFOUND;

DBMS_OUTPUT.PUT_LINE( v_nume||' '||v_sal); END LOOP; END; c. DECLARE CURSOR ang_cursor IS SELECT id_angajat,nume, salariu FROM angajati WHERE id_departament =30; v_ang_id angajati.id_angajat%TYPE; v_nume angajati.nume%TYPE; v_sal angajati.salariu%TYPE; BEGIN OPEN ang_cursor; LOOP FETCH ang_cursor INTO v_ang_id,v_nume, v_sal; EXIT WHEN ang_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE( v_nume||' '||v_sal); END LOOP; END;

6.Care din urmatoarele afirmatii este adevarata?' a. Pentru a insera un element nou intr-un tablou imbricat, dimensiunea acestuia trebuie extinsa cu ajutorul metodei EXTEND. b. Pentru adaugarea de linii intr-un tablou indexat, acesta trebuie sa fie initializat cu ajutorul constructorului.

c. Pentru a insera un element nou intr-un tablou indexat, acesta trebuie extins cu metoda EXTEND. d. Spre deosebire de tablourile indexate, vectorii nu au o dimensiune maxima. 7. Se da urmatorul bloc PL/SQL:

DECLARE TYPE r_ang IS RECORD ( cod angajati.id_angajat%TYPE, sal angajati.salariu%TYPE, job angajati.id_job%TYPE); v_ang r_ang; BEGIN SELECT id_angajat, salariu, id_job INTO v_ang FROM angajati WHERE id_angajat = 100; DBMS_OUTPUT.PUT_LINE ('Angajatul cu codul '|| v_ang.cod || ' are salariul in valoare de ' || v_ang.sal); END; Stiind ca in tabelul angajati exista angajatul cu codul 100 care are un salariu de 5000, care dintre urmatoarele afirmatii nu este adevarata?

a. Executia blocului se incheie cu o eroare, deoarece comanda SELECT utilizeaza coloana id_job care ulterior nu este folosita. b Clauza INTO v_ang a comenzii SELECT poate fi inlocuita cu clauza INTO v_ang.cod, v_ang.sal, v_ang.job. c. Definirea tipului r_ang este permisa in partea de declaratii a blocului PL/SQL.

d. Blocul se executa fara erori si afiseaza mesajul 'Angajatul cu codul 100 are salariul in valoare de 5000'.

8.Care este varianta corecta pentru a folosi un ciclu cursor cu subcereri care sa afiseze numele si salariul salariatilor care au salariul mai mic decat o valoare introdusa de la tastatura?

a. DECLARE v_sal number:=&p_sal; BEGIN FOR c IN (SELECT nume, salariu FROM angajati WHERE salariu<v_sal) LOOP DBMS_OUTPUT.PUT_LINE('Salariatul '|| nume|| ' are salariul ' || salariu); END LOOP; END; b. DECLARE v_sal number:=&p_sal; BEGIN FOR c IN (SELECT nume, salariu FROM angajati WHERE salariu < v_sal) LOOP DBMS_OUTPUT.PUT_LINE('Salariatul '||c.nume|| ' are salariul ' ||c.salariu); END LOOP; END;

c. ACCEPT p_sal PROMPT 'Dati o valoare: ' DECLARE v_sal number:=&p_sal; BEGIN FOR c IN (SELECT nume, salariu FROM angajati WHERE salariu>=v_sal) LOOP DBMS_OUTPUT.PUT_LINE('Salariatul '||c.nume|| ' are salariul ' ||c.salariu); END LOOP; END; 9.Care este varianta corecta prin care se afiseaza numarul total de angajati, respectiv numarul de angajati pentru fiecare job?

a. DECLARE TYPE tip_job IS TABLE OF joburi.nume_job%TYPE;

TYPE tip_nr IS TABLE OF NUMBER; t_job tip_job; t_nr tip_nr; BEGIN SELECT nume_job, COUNT(*) BULK COLLECT INTO t_job, t_nr FROM angajati a, joburi j WHERE a.id_job = j.id_job GROUP BY nume_job; FOR i IN 1..t_job.COUNT-1 LOOP DBMS_OUTPUT.PUT_LINE ('Pe jobul '||t_job(i) || ' lucreaza ' || t_nr(i) || ' angajati'); END LOOP; DBMS_OUTPUT.PUT_LINE ('Numarul total de angajati este ' || t_nr(t_nr.LAST)); END;

b. DECLARE TYPE tip_job IS TABLE OF joburi.nume_job%TYPE; TYPE tip_nr IS TABLE OF NUMBER; t_job tip_job; t_nr tip_nr; BEGIN SELECT nume_job, COUNT(*) BULK COLLECT INTO t_job, t_nr FROM angajati a, joburi j WHERE a.id_job = j.id_job GROUP BY GROUPING SETS (nume_job,()); FOR i IN 1..t_job.COUNT-1 LOOP DBMS_OUTPUT.PUT_LINE ('Pe jobul '||t_job(i)|| ' lucreaza ' || t_nr(i) || ' angajati'); END LOOP; DBMS_OUTPUT.PUT_LINE ('Numarul total de angajati este ' || t_nr(t_nr.LAST)); END;

c. DECLARE TYPE tip_job IS TABLE OF joburi.nume_job%TYPE; TYPE tip_nr IS TABLE OF NUMBER; t_job tip_job; t_nr tip_nr;

BEGIN SELECT nume_job, COUNT(*) BULK COLLECT INTO t_job, t_nr FROM angajati a, joburi j WHERE a.id_job = j.id_job GROUP BY ROLLUP (nume_job, ()); FOR i IN 1..t_job.COUNT-1 LOOP DBMS_OUTPUT.PUT_LINE ('Pe jobul ' ||t_job(i)|| ' lucreaza ' || t_nr(i) || ' angajati'); END LOOP; DBMS_OUTPUT.PUT_LINE ('Numarul total de angajati este ' || t_nr(t_nr.LAST)); END; 10. Care este varianta corecta prin care se adauga in tabelul angajati un nou camp numit telefon de tip tablou imbricat, prin care se vor stoca pentru fiecare salariat numerele sale de telefon, si apoi se insereaza o linie noua in tabel? a. CREATE TYPE lista AS TABLE OF VARCHAR2(20); ALTER TABLE angajati ADD (telefon lista) NESTED TABLE telefon STORE AS tabel_tel; INSERT INTO angajati (id_angajat, telefon) VALUES(300, lista(0214567897,0214567898,0214567899));

b. CREATE TYPE lista AS TABLE OF VARCHAR2(20); ALTER TABLE angajati ADD telefon lista; INSERT INTO angajati VALUES(200,'xxx',4000,40000,lista(0214567898,0214567899));

c. CREATE TYPE lista AS TABLE OF VARCHAR2(20); ALTER TABLE angajati ADD (telefon lista) NESTED TABLE telefon STORE AS tabel_tel; INSERT INTO angajati(telefon) VALUES(200,'xxx', 4000, 40000, lista(0214567898,0214567899)); 11. Se defineste un trigger prin care nu se permite micsorarea pretului cartilor din tabelul carti. Care din urmatoarele variante este corecta?

a) CREATE TRIGGER trigger_carti BEFORE UPDATE OF pret ON carti FOR EACH ROW WHEN (NEW.pret<OLD.pret) BEGIN RAISE_APPLICATION_ERROR(-20003,pretul cartilor nu poate fi micsorat); END; b) CREATE TRIGGER trigger_carti AFTER UPDATE OF pret ON carti FOR EACH ROW BEGIN IF (NEW.pret<OLD.pret) THEN BEGIN RAISE_APPLICATION_ERROR(-20002,pretul cartilor nu poate fi micsorat); c) CREATE TRIGGER trigger_carti BEFORE UPDATE OF pret ON carti BEGIN IF (NEW.pret<OLD.pret) THEN RAISE_APPLICATION_ERROR(-20001,pretul cartilor nu poate fi micsorat); END IF; END; 12) Codul urmator DECLARE PROCEDURE p1(val NUMBER) IS BEGIN UPDATE angajati SET salariu=salariu+val WHERE cod_departmen=10; END; BEGIN p1(700); END a) declara o procedura stocata cu un parametru de tip IN b) declara o procedura stocata cu un parametru de tip OUT c) declara o procedura locala cu un parametru de tip IN

d) contine erori

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