Sunteți pe pagina 1din 64

SGBD 2010

1. Care este varianta corecta pentru declararea urmatoarelor variabile?

a. v_valoare NUMBER(15) NOT NULL := 0; %TYPE trebuie aplicata pe


v_data_achizitie DATE DEFAULT SYSDATE; variabila, coloana, camp sau
c_valoare CONSTANT NUMBER:=1000; atribut nu pe opere
v_cod_oper opere%TYPE;
b. v_valoare NUMBER(15) NOT NULL;
v_data_achizitie DATE DEFAULT SYSDATE; A fost intalnit simbolul opere
c_valoare CONSTANT NUMBER; cand era asteptata una din
v_cod opera opere.cod_opera%TYPE; urmatoarele
c v_valoare NUMBER(15) NOT NULL := 0;
v_data_achizitie DATE DEFAULT SYSDATE;
c_valoare CONSTANT NUMBER:= 1000;
v_ cod_opera opere.cod_opera%TYPE;

2. Care din urmatoarele declaratii de valabilitate este corecta?

a. v_id_student NUMBER(5);
v_nume_student VARCHAR2(35) NOT NUL:=Ionescu; Identificatorul Ionescu
v_prenume_student CHAR(20); trebuia declarat
v_data DATE DEFAULT SYSDATE;
b. v_id_student NUMBER(5);
v_nume_student VARCHAR2(35) NOT NUL:=’Ionescu’;
v_prenume_student studenti.prenume%TYPE;
v_data DATE:=SYSDATE+1;
c. v_id_student NUMBER(2):=150;
v_nume_student studenti.nume%ROWTYPE:=’Ionescu’; Cu indicatorul %ROWTYPE
v_prenume_student CHAR(20); numiti tabela, cursor sau un
v_data DATE:=SYSDATE+1; indicativ cursor

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. Se va returna o eroare, deoarece variabila carte este utilizata nefiind initializata.


b. Se va returna o eroare, deoarece nu se poate utiliza clauza DEFAULT pentru a initializa o
variabila de tip VARCHAR2.
c. Blocul se executa fara erori si afiseaza 'null Eminescu'.
d. Blocul se executa fara erori si afiseaza 'Eminescu'
4. 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. Va fi generata o eroare deoarece variabila nume este utilizata nefiind initializata.


b. Blocul se executa fara erori si afisaza 'Sirul are caractere').
c. Blocul se executa fara erori si afisaza 'Sirul are 0 caractere').
d. 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. Blocul genereaza o eroare, deoarece variabila p_salariu nu este initializata.


b. Variabila p_salariu reprezinta o variabila de substitutie, a carei valoare poate fi data prin
utilizarea comenzii DEFINE din SQL*PLUS.
c. 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.
d. Daca valoarea variabilei v-salariu este 500, atunci blocul se executa fara erori si afiseaza
textul 'Bonusul este 100'.
6. Se da urmatorul bloc PL/SQL:

BEGIN
SELECT nume_job
INTO :rezultat
FROM angajat a, joburi b
WHERE a.id_job=b.id_job
AND id_angajat=100;
DBMS_OUTPUT_LINE('Numele jobului este'|| :rezultat);
END;

Care din urmatoarele afirmatii este adevarata?

a. Blocul se executa fara erori si afisaza numele jobului angajatului avand codul 100.
b. Executia blocului se incheie cu o eroare, deoarece variabila de legatura rezultat nu este
declarata in afara blocului PL/SQL.
c. Executia blocului se incheie cu o eroare, deoarece utilizarea clauzei INTO a comenzii
SELECT nu este corecta.
d. Valoarea variabilei de legatura rezultat nu poate fi afisata decat din interiorul blocului
PL/SQL.

7. Se da urmatorul bloc PL/SQL:

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. Executia blocului se incheie cu o eroare, deoarece comanda clauza SET a comenzii UPDATE
este utilizata gresit.
b. Executia blocului se incheie cu o eroare, deoarece comanda COMMIT nu poate fi utilizata
intr-un bloc PL/SQL.
c. Executia blocului se incheie cu o eroare, deoarece metoda ROWCOUNT este utilizata pentru
un cursor nedeclarat.
d. 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.
8. Variabila g_mesaj declarata ca mai jos este:

VARIABLE g_mesaj VARCHAR2 (50)


BEGIN
:g_mesaj := ‘Invat PL/SQL;
END;

a. Variabila de substitutie.
b. De tip record.
c. Variabila de legatura.
d. De tip varray.

9. Care este varianta corecta pentru afisarea variabilei v_mesaj ?

a. VARIABLE v_mesaj VARCHAR2 (50)


A fost intalnit simbolul v_mesaj cand era
BEGIN asteptat := etc
:v_mesaj := ‘Invat PL/SQL’;
PRINT v_mesaj;
END;
/
b. VARIABLE v_mesaj VARCHAR2 (30)
BEGIN
:v_mesaj := ‘Invat PL/SQL’;
END;
/
c. VARIABLE v_mesaj VARCHAR2 (50)
Identificatorul v_mesaj trebuia declarat
BEGIN
:v_mesaj := ‘Invat PL/SQL’;
DBMS_OUTPUT.PUT_LINE ( v_mesaj);
END;
/

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. NOT EQUAL
b. EROARE
c. EQUAL
d. NIMIC
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 FROM angajati WHERE id_angajat = 100;
11 DBMS_OUTPUT.PUT_LINE (‘Nume’ || ang_record.nume ||’ Departament ‘ ||
13 ang_record.departament);
14 END;

a. INTO ang_record_type%type
b. INTO ang_record_type%rowtype
c. INTO ang_record_type
d. 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. RETURNING angajati%rowtype
b. RETURNING id_angajat, RETURNING salariu, RETURNING id_job
c. RETURNING id_angajat, salariu, id_job
d. RETURNING v_ang
13. Pentru ca urmatorul bloc PL/SQL sa fie corect trebuie adaugat la linia 6 urmatorul cod:

1 DECLARE
2 TYPE typetablou IS TABLE OF NUMBER;
3 tablou typetablou:= typetablou();
4 BEGIN
5 FOR i IN 1..10 LOOP
6
7 tablou(i) :=i;
8 END LOOP;
9 END;

a. tablou.EXTEND;
b. tablou:= typetablou();
c. tablou(i):= typetablou();
d. tablou(i).NEXT;

14. Care dintre urmatoarele blocuri se executa cu erori?

a. declare
alfa interval year to month;
begin
alfa :=interval ‘2 - 5’ year to month;
DBMS_OUTPUT.PUT_LINE(‘alfa = ‘|| alfa);
end;
b. declare
alfa interval year to month;
begin
alfa :=interval ‘8’ month;
DBMS_OUTPUT.PUT_LINE(‘alfa = ‘|| alfa);
end;
c. declare
alfa interval year to month;
begin
alfa := ‘20 - 10’;
DBMS_OUTPUT.PUT_LINE(‘alfa = ‘|| alfa);
end;
d. declare
alfa interval month; A fost intalnit simbolul month
begin cand era asteptat := etc
alfa :=interval ‘8’ month;
DBMS_OUTPUT.PUT_LINE(‘alfa = ‘|| alfa);
end;
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. ACCEPT sem PROMPT ‘sem=’


b. VARIABLE sem=li
c. DEFINE sem
d. TYPE SEM=i

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; Introduce valorea 1 de 5 ori
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;
17. Se da urmatorul bloc PL/SQL
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. tab1 este NOT NULL


tab2 este NOT NULL
b. tab1 este NULL
tab2 este NOT NULL
c. EROARE
d. tab1 este NULL
tab2 este NULL

18. Se da urmatorul bloc PL/SQL

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. tabloul are 10 elemente


tabloul are 10 elemente
b. Eroare
c. tabloul are 10 elemente
tabloul are 0 elemente
d. tabloul are 0 elemente
tabloul are 0 elemente
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 1…10 LOOP
tab.NEXT(i)
tab(i) := i;
END LOOP;
END;
b. DECLARE
TYPE tablou IS TABLE OF NUMBER;
tab tablou:= tablou();
BEGIN FOR i IN 1…10 LOOP
tab.EXTEND; tab(i) := i;
END LOOP;
END;
c. DECLARE
TYPE tablou IS TABLE OF NUMBER;
tab tablou:= tablou();
BEGIN
FOR i IN 1…10 LOOP
tab(i) := tab(i) + i;
END LOOP;
END;
d. DECLARE
TYPE tablou IS TABLE OF NUMBER;
tab tablou:= tablou();
BEGIN
FOR i IN 1…10 LOOP
tab(i) := i;
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. 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;
b. 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;
c. 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?
RASPUNSUL CORECT ESTE d. NU ESTE PRINS IN GRILA…

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;

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;

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; YYYY Indicator nevalid
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 Aici sqlplus se inteapa
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;

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. Blocul se executa fara erori, introducandu-se in tabelul informatii o linie cu toate valorile
La mine
null , respectiv toate liniile din tabelul angajati
se
b. Executia blocului se incheie cu o eroare, deoarece cursorul c nu este inchis dupa ce este
inteapa si
utilizat
sqlplus si
c. Executia blocului se incheie cu o eroare, deoarece utilizarea comenzii COMMIT nu este
sql
permisa in interiorul unui bloc PL/SQL
developer
d. Blocul se executa fara erori, introducandu-se in tabelul informatii toate liniile din tabelul
angajati

27. Parametrii unei functii pot fi:

a. De intrare (IN), de intrare/iesire (IN/OUT) sau de iesire (OUT)


b. Numai de intrare (IN)
c. Numai de iesire (OUT)
d. De intrare (IN) sau de iesire (OUT)
28. Care dintre urmatoarele variante apeleaza corect functia F_TEST care are un singur parametru
numeric?

a. SELECT F_TEST (80)


FROM DUAL ;
b. DECLARE
nr NUMBER;
BEGIN
Nr:=F_TEST();
END;
c. VARIABLE nr NUMBER
CALL F_TEST () INTO:nr;
PRINT nr
d. VARIABLE nr NUMBER
CALL FUNCTION F_TEST (80) INTO:nr;
PRINT nr

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. USER_OBJECTS
b. USER_ERRORS
c. USER_FUNCTIONS
d. USER_SOURCE

30. Ce trebuie adaugat la linia 9 pentru ca urmatoarea functie sa fie corect creata?

1. CREATE OR REPLACEFUNCTION nr_sal(v_dept NUMBER)


2. RETURN NUMBER IS
3. 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. DBMS_OUTPUT.PUT_LINE(v_numar);
b. COMMIT;
c. RETURN v_numar;
d. nu mai trebuie adaugat nimic.
31. Se da functia de mai jos ,care permite calcularea unui impozit pe salariu de 10%.

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 aceasta functie?

a. SELECT id_angajat, nume, salariu, impozit tax Tipuri de argument sau numar
FROM angajati gresit in apelarea lui impozit
WHERE id_departament=50;
b. VARIABILE tax:=impozit(salariu)
SELECT id_angajat, nume, salariu, tax Inceput de comanda
necunoscut VARIABILE,
FROM angajati
Identificator tax nevalid
WHERE id_departament=50;
c. SELECT id_angajat, nume, salariu, impozit(salariu) tax
FROM angajati
WHERE id_departament=50;
d. DECLARE:tax NUMBER
A fost intalnit simbolul end of file
BEGIN cand se asteptau .....
:tax:= impozit(salariu);

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. USER_SOURCE Aici la a imi arata doar proceduri si functii (listeaza si codul)


b. DUAL La d include si tabelele mele (adica cam toate obiectele
c. USER_ERRORS utilizatorului meu)
d. USER_OBJECTS

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. 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;
b. 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;

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;
b. 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;
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;
35. Ce trebuie adaugat la linia 11 pentru ca in urmatorul bloc PL/SQL sa se foloseasca corect cursorul?

1 DECLARE
2 CURSOR c_ang IS
3 SELECT *
4 FROM angajati
5 WHERE TO_CHAR(data_angajarii,’YYYY’)=2000
6 FOR UPDATE OF salariu NOWAIT;
7 BEGIN
8 FOR v_c_ang IN c_ang LOOP
9 UPDATE angajati
10 SET salariu=salariu+1000
11 ………………………..
12 END LOOP;
13 END;

a. END UPDATE;
b. WHERE CURRENT OF c_ang;
c. FOR EACH ROW
d. EXIT WHEN c_ang%NOTFOUND;

36. 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:

a. un cursor explicit
b. nu apare nici un cursor
c. un cursor implicit
d. un ciclu cursor cu subcereri

37. Care dintre urmatoarele afirmatii nu este corecta?

a. Un trigger poate fi redenumit utilizand o comanda ALTER TRIGGER.


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

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

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
b. Trigger1 - 0
Trigger2 - 3
Trigger3 - 3
Trigger4 - 0
c. Trigger1 - 0
Trigger2 - 1
Trigger3 - 3

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. 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;
c. 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;

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;
END;
b. 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;
c. 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;

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;
b. 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;
c. 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;
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. O comanda prin care se adauga o constrangere de cheie primara unui table existent.
b. O comanda prin care se modifica valorile unor inregistrari dintr-un tabel.
c. O comanda prin care se creaza un tabel.
d. O comanda prin care se eliminaun index.

44. Se presupune că într-o sală a unui muzeu pot fi expuse maximum 10 opere de artă. Pentru aceasta
se creează următorul 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”.
Grila SGBD 2010 OK

Number: 000-000
Passing Score: 500
Time Limit: 45 min
File Version: 1.0

SGBD 2010
Exam A

QUESTION 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 NUMBER(15) NOT NULL;
v_data_achizitie DATE DEFAULT SYSDATE;
c_valoare CONSTANT NUMBER;
v_cod opera opere.cod_opera%TYPE;
C. v_valoare NUMBER(15) NOT NULL := 0;
v_data_achizitie DATE DEFAULT SYSDATE;
c_valoare CONSTANT NUMBER:= 1000;
v_ cod_opera opere.cod_opera%TYPE;

QUESTION 2
Care din urmatoarele declaratii de valabilitate este corecta?

A. v_id_student NUMBER(5);
v_nume_student VARCHAR2(35) NOT NUL:=Ionescu;
v_prenume_student CHAR(20);
v_data DATE DEFAULT SYSDATE;
B. v_id_student NUMBER(5);
v_nume_student VARCHAR2(35) NOT NUL:='Ionescu';
v_prenume_student studenti.prenume%TYPE;
v_data DATE:=SYSDATE+1;
C. v_id_student NUMBER(2):=150;
v_nume_student studenti.nume%ROWTYPE:='Ionescu';
v_prenume_student CHAR(20);
v_data DATE:=SYSDATE+1;

QUESTION 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. Se va returna o eroare, deoarece variabila carte este utilizata nefiind initializata.


B. Se va returna o eroare, deoarece nu se poate utiliza clauza DEFAULT pentru a initializa o
variabila de tip VARCHAR2.
C. Blocul se executa fara erori si afiseaza 'null Eminescu'.
D. Blocul se executa fara erori si afiseaza 'Eminescu'
QUESTION 4
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. Va fi generata o eroare deoarece variabila nume este utilizata nefiind initializata.


B. Blocul se executa fara erori si afisaza 'Sirul are caractere').
C. Blocul se executa fara erori si afisaza 'Sirul are 0 caractere').
D. Va fi generata o eroare deoarece variabila v_nr este utilizata nefiind initializata

QUESTION 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. Blocul genereaza o eroare, deoarece variabila p_salariu nu este initializata.


B. Variabila p_salariu reprezinta o variabila de substitutie, a carei valoare poate fi data prin utilizarea
comenzii DEFINE din SQL*PLUS.
C. 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.
D. Daca valoarea variabilei v-salariu este 500, atunci blocul se executa fara erori si afiseaza textul
'Bonusul este 100'.

QUESTION 6
Se da urmatorul bloc PL/SQL:

BEGIN
SELECT nume_job
INTO :rezultat
FROM angajat a, joburi b
WHERE a.id_job=b.id_job
AND id_angajat=100;
DBMS_OUTPUT_LINE('Numele jobului este'|| :rezultat);
END;

Care din urmatoarele afirmatii este adevarata?

A. Blocul se executa fara erori si afisaza numele jobului angajatului avand codul 100.
B. Executia blocului se incheie cu o eroare, deoarece variabila de legatura rezultat nu este
declarata in afara blocului PL/SQL.
C. Executia blocului se incheie cu o eroare, deoarece utilizarea clauzei INTO a comenzii SELECT nu
este corecta.
D. Valoarea variabilei de legatura rezultat nu poate fi afisata decat din interiorul blocului PL/SQL.

QUESTION 7
Se da urmatorul bloc PL/SQL:

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. Executia blocului se incheie cu o eroare, deoarece comanda clauza SET a comenzii UPDATE este
utilizata gresit.
B. Executia blocului se incheie cu o eroare, deoarece comanda COMMIT nu poate fi utilizata intr-un
bloc PL/SQL.
C. Executia blocului se incheie cu o eroare, deoarece metoda ROWCOUNT este utilizata pentru un
cursor nedeclarat.
D. 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.

QUESTION 8
Variabila g_mesaj declarata ca mai jos este:

VARIABLE g_mesaj VARCHAR2 (50)


BEGIN
:g_mesaj := `Invat PL/SQL;
END;

A. Variabila de substitutie.
B. De tip record.
C. Variabila de legatura.
D. De tip varray.

QUESTION 9
Care este varianta corecta pentru afisarea variabilei v_mesaj ?

A. VARIABLE v_mesaj VARCHAR2 (50)


BEGIN
:v_mesaj := `Invat PL/SQL';
PRINT v_mesaj;
END;
/
B. VARIABLE v_mesaj VARCHAR2 (30)
BEGIN
:v_mesaj := `Invat PL/SQL';
END;
/
C. VARIABLE v_mesaj VARCHAR2 (50)
BEGIN
:v_mesaj := `Invat PL/SQL';
DBMS_OUTPUT.PUT_LINE ( v_mesaj);
END;
/

QUESTION 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. NOT EQUAL
B. EROARE
C. EQUAL
D. NIMIC
QUESTION 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 FROM angajati WHERE id_angajat = 100;
11 DBMS_OUTPUT.PUT_LINE (`Nume' || ang_record.nume ||' Departament ` || 13
ang_record.departament);
14 END;

A. INTO ang_record_type%type
B. INTO ang_record_type%rowtype
C. INTO ang_record_type
D. INTO ang_record

QUESTION 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. RETURNING angajati%rowtype
B. RETURNING id_angajat, RETURNING salariu, RETURNING id_job
C. RETURNING id_angajat, salariu, id_job
D. RETURNING v_ang

QUESTION 13
Pentru ca urmatorul bloc PL/SQL sa fie corect trebuie adaugat la linia 6 urmatorul cod:

1 DECLARE
2 TYPE typetablou IS TABLE OF NUMBER;
3 tablou typetablou:= typetablou();
4 BEGIN
5 FOR i IN 1..10 LOOP
6 ....................................
7 tablou(i) :=i;
8 END LOOP;
9 END;

A. tablou.EXTEND;
B. tablou:= typetablou();
C. tablou(i):= typetablou();
D. tablou(i).NEXT;

QUESTION 14
Care dintre urmatoarele blocuri se executa cu erori?

A. declare
alfa interval year to month;
begin
alfa :=interval `2 - 5' year to month;
DBMS_OUTPUT.PUT_LINE(`alfa = `|| alfa);
end;
B. declare
alfa interval year to month;
begin
alfa :=interval `8' month;
DBMS_OUTPUT.PUT_LINE(`alfa = `|| alfa);
end;
C. declare
alfa interval year to month;
begin
alfa := `20 - 10';
DBMS_OUTPUT.PUT_LINE(`alfa = `|| alfa);
end;
D. declare
alfa interval month;
begin
alfa :=interval `8' month;
DBMS_OUTPUT.PUT_LINE(`alfa = `|| alfa);
end;

QUESTION 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. ACCEPT sem PROMPT `sem='


B. VARIABLE sem=li
C. DEFINE sem
D. TYPE SEM=i

QUESTION 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;

QUESTION 17
Se da urmatorul bloc PL/SQL

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. tab1 este NOT NULL


tab2 este NOT NULL
B. tab1 este NULL
tab2 este NOT NULL
C. EROARE
D. tab1 este NULL
tab2 este NULL

QUESTION 18
Se da urmatorul bloc PL/SQL

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. tabloul are 10 elemente


tabloul are 10 elemente
B. Eroare
C. tabloul are 10 elemente
tabloul are 0 elemente
D. tabloul are 0 elemente
tabloul are 0 elemente

QUESTION 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 1...10 LOOP
tab.NEXT(i)
tab(i) := i;
END LOOP;
END;
B. DECLARE
TYPE tablou IS TABLE OF NUMBER;
tab tablou:= tablou();
BEGIN FOR i IN 1...10 LOOP
tab.EXTEND; tab(i) := i;
END LOOP;
END;
C. DECLARE
TYPE tablou IS TABLE OF NUMBER;
tab tablou:= tablou();
BEGIN
FOR i IN 1...10 LOOP
tab(i) := tab(i) + i;
END LOOP;
END;
D. DECLARE
TYPE tablou IS TABLE OF NUMBER;
tab tablou:= tablou();
BEGIN
FOR i IN 1...10 LOOP
tab(i) := i;
END LOOP;
END;

QUESTION 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. 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;
B. 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;
C. 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;

QUESTION 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;

QUESTION 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));

QUESTION 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;
D. Raspuns Corect

QUESTION 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;

QUESTION 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;

QUESTION 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. Blocul se executa fara erori, introducandu-se in tabelul informatii o linie cu toate valorile null ,
respectiv toate liniile din tabelul angajati
B. Executia blocului se incheie cu o eroare, deoarece cursorul c nu este inchis dupa ce este utilizat
C. Executia blocului se incheie cu o eroare, deoarece utilizarea comenzii COMMIT nu este permisa in
interiorul unui bloc PL/SQL
D. Blocul se executa fara erori, introducandu-se in tabelul informatii toate liniile din tabelul angajati
QUESTION 27
Parametrii unei functii pot fi:

A. De intrare (IN), de intrare/iesire (IN/OUT) sau de iesire (OUT)


B. Numai de intrare (IN)
C. Numai de iesire (OUT)
D. De intrare (IN) sau de iesire (OUT)

QUESTION 28
Care dintre urmatoarele variante apeleaza corect functia F_TEST care are un singur parametru
numeric?

A. SELECT F_TEST (80)


FROM DUAL ;
B. DECLARE
nr NUMBER;
BEGIN
Nr:=F_TEST();
END;
C. VARIABLE nr NUMBER
CALL F_TEST () INTO:nr;
PRINT nr
D. VARIABLE nr NUMBER
CALL FUNCTION F_TEST (80) INTO:nr;
PRINT nr

QUESTION 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. USER_OBJECTS
B. USER_ERRORS
C. USER_FUNCTIONS
D. USER_SOURCE

QUESTION 30
Ce trebuie adaugat la linia 9 pentru ca urmatoarea functie sa fie corect creata?

1 CREATE OR REPLACEFUNCTION nr_sal(v_dept NUMBER)


2 RETURN NUMBER IS
3 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. DBMS_OUTPUT.PUT_LINE(v_numar);
B. COMMIT;
C. RETURN v_numar;
D. nu mai trebuie adaugat nimic.

QUESTION 31
Se da functia de mai jos ,care permite calcularea unui impozit pe salariu de 10%.

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 aceasta functie?

A. SELECT id_angajat, nume, salariu, impozit tax


FROM angajati
WHERE id_departament=50;
B. VARIABILE tax:=impozit(salariu)
SELECT id_angajat, nume, salariu, tax
FROM angajati
WHERE id_departament=50;
C. SELECT id_angajat, nume, salariu, impozit(salariu) tax
FROM angajati
WHERE id_departament=50;
D. DECLARE:tax NUMBER
BEGIN
:tax:= impozit(salariu);

QUESTION 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. USER_SOURCE
B. DUAL
C. USER_ERRORS
D. USER_OBJECTS
QUESTION 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. 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;
B. 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;

QUESTION 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;
B. 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;
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;

QUESTION 35
Ce trebuie adaugat la linia 11 pentru ca in urmatorul bloc PL/SQL sa se foloseasca corect
cursorul?

1 DECLARE
2 CURSOR c_ang IS
3 SELECT *
4 FROM angajati
5 WHERE TO_CHAR(data_angajarii,'YYYY')=2000
6 FOR UPDATE OF salariu NOWAIT;
7 BEGIN
8 FOR v_c_ang IN c_ang LOOP
9 UPDATE angajati
10 SET salariu=salariu+1000
11 .............................
12 END LOOP;
13 END;

A. END UPDATE;
B. WHERE CURRENT OF c_ang;
C. FOR EACH ROW
D. EXIT WHEN c_ang%NOTFOUND;

QUESTION 36
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:

A. un cursor explicit
B. nu apare nici un cursor
C. un cursor implicit
D. un ciclu cursor cu subcereri

QUESTION 37
Care dintre urmatoarele afirmatii nu este corecta?

A. Un trigger poate fi redenumit utilizand o comanda ALTER TRIGGER.


B. Dupa ce este definit, triggerul devine activ si va fi executat ori de cate ori au loc operatiile
declansatoare asociate acestuia.
C. Un trigger poate fi recompilat utilizand o comanda ALTER TRIGGER.
D. Un trigger la nivel de linie este executat o singura data, indiferent de numarul de linii
afectate de comanda declansatoare.

QUESTION 38
Care dintre urmatoarele afirmatii este corecta?

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

QUESTION 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
B. Trigger1 - 0
Trigger2 - 3
Trigger3 - 3
Trigger4 - 0
C. Trigger1 - 0
Trigger2 - 1
Trigger3 - 3

QUESTION 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. 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;
C. 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;

QUESTION 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;
END;
B. 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;
C. 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;

QUESTION 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;
B. 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;
C. 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;

QUESTION 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. O comanda prin care se adauga o constrangere de cheie primara unui table existent.
B. O comanda prin care se modifica valorile unor inregistrari dintr-un tabel.
C. O comanda prin care se creaza un tabel.
D. O comanda prin care se eliminaun index.

QUESTION 44
Se presupune că într-o sală a unui muzeu pot fi expuse maximum 10 opere de artă. Pentru
aceasta se creează următorul 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".
Subiecte SGBD

1.Ce comanda sterge din tabelul Salariat


Cod_ang Nume Prenume Data_ang Virsta Email Salariu
Not null Sir de Sir de Date,valoare Numeric 2 Sir de Valoare
Numeric caractere caractere implicita caractere implicita 0,
de 5 max.20 max.20 data curenta dimensiune numeric de
fixa 30 10 cu 2
zecimale
Coloana nume si salariu?

a. ALTER TABLE SALARIAT


DROP nume,salariu;
b. ALTER TABLE SALARIAT
DROP COLUMN (nume,salariu);
c. ALTER TABLE SALARIAT
DROP (nume,salariu);
d. ALTER TABLE SALARIAT
DROP COLUMN nume, COLUMN salariu;

2.Efectele unei comenzi DDL pot fi anulate cu o comanda ROLLBACK?


Adevarat sau Fals

3.Pentru a introduce in tabelul SALARIAT, 2 coloane : Cod_funct si Email ce varianta folosim?


Cod_ang Nume Prenume Data_ang Virsta Salariu
Not null Sir de Sir de Date,valoare Numeric 2 Valoare
Numeric caractere caractere implicita implicita
de 5 max.20 max.20 data curenta 0, numeric
de 10 cu 2
zecimale

a. ALTER TABLE SALARIAT ADD Cod_funct Number(2), Alter Column Add Email Char(25);
b. ALTER TABLE SALARIAT ADD Cod_funct Number(2), ADD Email Char(25);
c. ALTER TABLE SALARIAT ADD (Cod_funct Number(2), Email Char(25));
d. ALTER TABLE SALARIAT ADD Cod_funct Number(2), Alter ADD Email Char(25);

4. Care este comanda corecta pentru a afisa nume,prenume si virsta salariatilor , iar pentru cei care
au virsta necunoscuta sa apara ” virsta necunoscuta”?

a.SELECT nume,prenume, NVL(virsta,”virsta necunoscuta”) FROM SALARIAT;


b.SELECT nume,prenume, NVL(TO_CHAR(virsta),”virsta necunoscuta”) FROM
SALARIAT;
c. SELECT nume,prenume, NVL(CHAR(virsta),”virsta necunoscuta”) FROM SALARIAT;

d. SELECT nume,prenume, NVL2(TO_CHAR(virsta),”virsta necunoscuta”) FROM SALARIAT;

5. Constringerea NOT NULL poate fi adaugata utilizind o comanda ALTER TABLE…. ADD
CONSTRAINT?
Adevat sau Fals

6.Care este comanda care determina stergerea tuturor salariatilor din departamentul 10?
a. DELETE SALARIAT
WHERE Cod_dep=10;
b. DELETE TO SALARIAT
WHERE Cod_dep=10;
c. DROP FROM SALARIAT
WHERE Cod_dep=10;
d. . DELETE FROM SALARIAT
WHERE Cod_dep=10;

7.Care este varianta corecta pentru a crea tabelul SALARIAT cu caracetristicile de mai jos:
Cod_ang Nume Prenume Data_ang Virsta Email Salariu
Not null Sir de Sir de Date,valoare Numeric 2 Sir de Valoare
Numeric caractere caractere implicita caractere implicita 0,
de 5 max.20 max.20 data curenta dimensiune numeric de
50 10 cu 2
zecimale

a.CREATE TABEL SALARIAT( cod_ang Number (5) NOT NULL, nume VARCHAR
(20),prenume VARCHAR2(20),data_ang DATE DEFAULT SYSDATE, virsta Number
(2),email CHAR(50), salariu Number(10,2) DEFAULT 0);
b. CREATE TABEL SALARIAT( cod_ang Number (5) , nume VARCHAR
(20),prenume VARCHAR2(20),data_ang DATE , virsta Number (2),email CHAR(50), salariu
Number(10,2) DEFAULT 0);
c. CREATE TABEL SALARIAT( cod_ang Number (5) NOT NULL, nume VARCHAR
(20),prenume VARCHAR2(20),data_ang DATE , DEFAULT SYSDATE, virsta Number
(2),email CHAR(50), salariu Number(10,2) DEFAULT 0):

8. Actualizarile realizate pe o vizualizare, se propaga intotdeauna asupra tabelelor de date ?


Adevarat sau Fals

9. Care este comanda INCORECTA care afiseaza numele, salariul si virsta pentru toti salariatii
care cistiga mai mult de 1000, rezultatul fiind sortat descendent dupa salariu, iar pentru cei care au
acelasi salariu in ordine crescatoare dupa nume ?
a. SELECT nume,salariu,virsta
FROM SALARIAT
WHERE salariu>1000
ORDER by salariu DESC nume ASC;
b. SELECT nume,salariu,virsta
FROM SALARIAT
WHERE salariu>1000
ORDER by salariu DESC, nume ASC;
c. SELECT nume,salariu,virsta
FROM SALARIAT
WHERE salariu>1000
ORDER by salariu DESC , nume ;
d. SELECT nume,salariu,virsta
FROM SALARIAT
WHERE salariu>1000
ORDER by 2 DESC , 1 ASC;

10. Care comanda NU defineste corect un tabel ?


a. CREATE TABLE [schema]nume_tabel(nume_col tip_de_date[Default expresie]…);
b. CREATE TABLE nume_tabel [(col1,col2..)] AS subcerere;
c. CREATE TABLE [schema]nume_tabel(nume_col tip_de_date[Default
expresie][constringere_de_coloana]…);
d. CREATE TABLE [schema]nume_tabel(nume_col tip_de_date[Default
expresie][constringere_de_coloana] ][constringere la nivel de tabel);
11. Care este comanda corecta care sterge valoarea coloanei salariu pentru angajatii care sunt
angajati cu contract de colaborare ?
a. DELETE SALARIU
FROM SALARIATI
WHERE contract=’colaborare’;
b. UPDATE SALARIATI
SET SALARIU IS NULL
WHERE contract=’colaborare’;
c. DROP SALARIU
FROM SALARIATI
WHERE contract=’colaborare’;
d. UPDATE SALARIATI
SET SALARIU = NULL
WHERE contract=’colaborare’;

12. Cu ce comanda se creeaza tabelul SALARIAT_1 care sa aiba aceeasi structura cu tabelul
SALARIAT si contine salariati cu salariu mai mare cu 100?
Tabelul cel de mai sus nu l-am mai copiat o data……

a.CREATE TABLE SALARIAT_1 SELECT *FROM SALARIAT WHERE salariu>100;


b. CREATE TABLE SALARIAT_1 AS SELECT *FROM SALARIAT WHERE
salariu>100;
c. CREATE TABLE SALARIAT_1 SELECT FROM SALARIAT WHERE salariu>100;
d. CREATE TABLE SALARIAT_1 AS SELECT Cod_ang, Salariu FROM SALARIAT WHERE
salariu>100;

13. Pentru tabelul care este comanda corecta ptr. a modifica salariu la 3000 ,pentru angajatii care
lucreaza in departamentul 10 si au salariu mai mic de 3000?
a.UPDATE SALARIAT SET SALARIU=3000
WHERE cod_dep=10 AND salariu<3000;
b.MODIFY SALARIAT SET SALARIU=3000
WHERE cod_dep=10 , salariu<3000;
c. UPDATE SALARIAT SET cod_dep=10 AND Salariu<3000
WHERE salariu=3000;
d. MODIFY SALARIAT SET SALARIU=3000
WHERE cod_dep=10 AND salariu<3000;
Am raspuns: d

14. Efectele unei comenzi DML pot fi anulate cu o comanda ROLLBACK?


Adevat sau Fals ??

1. Care este forma corecta pentru a adauga constrangeri la nivel de coloana si /sau la nivel de tabel?

CREATE TABLE [schema.]nume_tabel (


nume_coloana tip_de_date, [DEFAULT expr] [constrangere_de_coloana], ...
..[constrangere la nivel de tabel])

CREATE TABLE [schema.]nume_tabel (


nume_coloana tip_de_date [DEFAULT expr], [constrangere_de_coloana] ...
..[constrangere la nivel de tabel])

CREATE TABLE [schema.]nume_tabel (


nume_coloana tip_de_date, [DEFAULT expr], [constrangere_de_coloana], ...
..[constrangere la nivel de tabel])
CREATE TABLE [schema.]nume_tabel (
nume_coloana tip_de_date [DEFAULT expr] [constrangere_de_coloana], ...
..[constrangere la nivel de tabel])

2. Care este comanda corecta care determina marirea salariul tuturor angajatilor din tabelul salariat cu 5%?

UPDATE salariu
SET salariu = salariu * 1.05;

UPDATE salariat
SET salariu = salariu * 1.05;

UPDATE salariat
SET salariu = 1.05;

UPDATE salariat
SET salariu = salariu + salariu* 1.05;

3. Care este comanda corecta care insereaza in tabelul TOTALURI(cod_departament, numar_angajati,


suma_salarii)?

INSERT INTO totaluri


SELECT cod_departament, COUNT(*),SUM(salariu)
FROM salariat
GROUP BY cod_departament;

INSERT INTO totaluri


SELECT cod_departament, SUM(cod_angajat),SUM(salariu)
FROM salariat
GROUP BY cod_departament;

INSERT INTO totaluri


SELECT cod_departament, COUNT(*),SUM(salariu)
FROM salariat;

INSERT INTO totaluri


SELECT cod_departament, COUNT(),SUM(salariu)
FROM salariat
ORDER BY cod_departament;

4. Care comanda afiseaza numele angajatilor, fara duplicate, care au manager?

SELECT DISTINCT nume


FROM salariat
WHERE manager IS NOT NULL;

SELECT DISTINCT nume


FROM salariat
WHERE manager IS NULL;

SELECT nume
FROM salariat
WHERE manager IS NOT NULL;

SELECT DISTINCT nume


FROM salariat
WHERE manager != NULL;

5. Care este comanda corecta care pentru fiecare facultate, se insereaza in tabelul SALARII(cod_fac, nr_prof,
total_sal_fac) numarul de profesori si suma salariilor pe care facultatea o plateste profesorilor sai?

INSERT TO TOTALURI
SELECT COD_FAC, COUNT(*) , SUM(SALARIU)
FROM PROF ORDER BY COD_FAC;

INSERT INTO TOTALURI


SELECT COD_FAC, COUNT(*) , SUM(SALARIU)
FROM PROF ;

INSERT INTO TOTALURI


SELECT COD_FAC, COUNT(*) , SUM(SALARIU)
FROM PROF GROUP BY COD_FAC;

INSERT INTO totaluri


SELECT COD_FAC, SUM(COD_PROF),SUM(SALARIU)
FROM PROF
GROUP BY COD_FAC;

6. Care secventa este corecta pentru a afisa citi angajati nu au o valoare introdusa pe coloana salariu?

SELECT COUNT()
FROM salariati
WHERE SALARIU =0;

SELECT COUNT(*)
FROM salariati
WHERE SALARIU =NULL;

SELECT COUNT(*)
FROM salariati
WHERE SALARIU IS NOT NULL;
SELECT COUNT(*)
FROM salariati
WHERE SALARIU IS NULL;

7. Care este comanda corecta care determina dublarea salariilor cu rotunjire la 2 zecimale a angajatilor care sunt
titulari?

UPDATE salariat
SET salariu=ROUND(salariu*2,2);

UPDATE salariat
SET salariu=ROUND(salariu*2)
WHERE titular =’y’;

UPDATE salariat
SET salariu=ROUND(salariu*2,2)
WHERE titular =’y’;

UPDATE salariat
SET salariu=ROUND(salariu*0.5,2)
WHERE titular =’y’;

8. Care este comanda corecta care afiseaza numele salariatilor care castiga mai mult decat salariul mediu pe
companie, in ordine crescatoare a salariului?

SELECT nume
FROM salariati
WHERE salariu >AVG(salariu);

SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati)
ORDER BY salariu;

SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati
ORDER BY salariu);

SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati)
ORDER BY 1;

9. Ce comanda modifica in tabelul SALARIAT

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU

not null sir de sir caractere date, valoare numeric de 2 sir de valoare
numeric de 5 caractere de de maxim 20 implicita caractere de implicita 0
maxim 20 data curentã dimensiune numar de 10
fixa, de 30 cu 2
zecimale

dimensiunea coloanei nume la 30 si pe cea a coloanei salariu la 12 cu 3 zecimale?

ALTER TABLE salariat


MODIFY nume VARCHAR2(30), salariu NUMBER(12,3);

ALTER TABLE salariat


MODIFY nume VARCHAR2(30), salariu NUMBER(12,3);

ALTER TABLE salariat


MODIFY nume VARCHAR2(30), MODIFY salariu NUMBER(12,3);

ALTER TABLE salariat


MODIFY (nume VARCHAR2(30), salariu NUMBER(12,3));

10. Care este comanda corecta care sterge valoarea coloanei salariu pentru angajatii care sunt angajati cu contract
de colaborare?

DELETE salariu
FROM salariati
WHERE contract=’colaborare’;

UPDATE salariati
SET salariu IS null
WHERE contract=’colaborare’;

DROP salariu
FROM salariati
WHERE contract=’colaborare’;

UPDATE salariati
SET salariu=null
WHERE contract=’colaborare’;

11. Care este comanda incorecta care afiseaza numele, salariul si varsta pentru toti salariatii care castiga mai mult
de 1000, rezultatul fiind sortat descendent dupa salariu, iar pentru cei care au acelasi salariu in ordine crescatoare
dupa nume?

SELECT nume, salariu, varsta


FROM salariat
WHERE salariu>1000
ORDER BY salariu DESC nume ASC;

SELECT nume, salariu, varsta


FROM salariat
WHERE salariu>1000
ORDER BY salariu DESC, nume ASC;
SELECT nume, salariu, varsta
FROM salariat
WHERE salariu>1000
ORDER BY salariu DESC, nume;

SELECT nume, salariu, varsta


FROM salariat
WHERE salariu>1000
ORDER BY 2 DESC, 1 ASC;

12. Actualizarile realizate asupra tabelelor de baza ale unei vizualizari se reflecta totdeauna in vizualizare

Adevărat
Fals

13. Care este comanda corecta pentru a afisa numele, prenumele si varsta salariatilor, iar pentru cei
care au varsta necunoscuta sa apara textul “varsta necunoscuta”?

SELECT nume, prenume, NVL(varsta, ‘varsta necunoscuta’)


FROM salariat;

SELECT nume, prenume, NVL(TO_CHAR(varsta), ‘varsta necunoscuta’)


FROM salariat;

SELECT nume, prenume, NVL(CHAR(varsta), ‘varsta necunoscuta’)


FROM salariat;

SELECT nume, prenume, NVL2(TO_CHAR(varsta), ‘varsta necunoscuta’)


FROM salariat;

14. Care comanda afiseaza numarul de angajati din fiecare departament?

SELECT cod_departament, COUNT(*)


FROM salariat;

SELECT cod_departament, SUM(cod_angajat)


FROM salariat
GROUP BY cod_departament;

SELECT cod_departament, COUNT(*)


FROM salariat
GROUP BY cod_departament;

SELECT cod_departament, COUNT()


FROM salariat
GROUP BY cod_departament;

15. Pentru a introduce in tabelul SALARIAT

COD _ANG NUME PRENUME DATA_ANG VARSTA SALARIU

not null sircaractere sir caractere date, valoare numeric de 2 valoare


numeric de 5 de maxim 20 de maxim 20 implicita data implicita 0
curentã numar de 10
cu 2 zecimale

doua coloane: Cod_Funct si Email ce varianta folosim?

ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ALTER COLUMN ADD Email char(25);

ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ADD Email CHAR(25);

ALTER TABLE SALARIAT ADD (Cod_Funct NUMBER(2) , Email CHAR(25));


ALTER TABLE SALARIAT ADD Cod_Funct NUMBER(2), ALTER ADD Email char(25);

16. Ce comanda creeaza tabelul SALARIAT_1 care sã aiba aceeiasi structura cu


tabelul SALARIAT

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU

not null sir de sir caractere date, valoare numeric de 2 sir de valoare
numeric de 5 caractere de de maxim 20 implicita caractere de implicita 0
maxim 20 data curentã dimensiune numar de 10
fixa, de 30 cu 2
zecimale

si sa contina salariatii care au salariu >100?

CREATE TABLE SALARIAT_1


SELECT * FROM SALARIAT WHERE SALARIU>100;

CREATE TABLE SALARIAT_1 AS


SELECT * FROM SALARIAT WHERE SALARIU>100;

CREATE TABLE SALARIAT_1 AS


SELECT FROM SALARIAT WHERE SALARIU>100;

CREATE TABLE SALARIAT_1 AS


SELECT COD_ANG, SALARIU FROM SALARIAT WHERE SALARIU>100;

17. Pentru a modifica dimensiunea coloanei prenume la 30 si pe cea a salariului la 12 cu 3 zecimale, din
tabelul SALARIAT

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU

not null sir de sir caractere date, valoare numeric de 2 sir de valoare
numeric de 5 caractere de de maxim 20 implicita caractere de implicita 0
maxim 20 data curentã dimensiune numar de 10
fixa, de 30 cu 2
zecimale

care varienta este corecta?

ALTER TABLE SALARIAT


MODIFY (prenume VARCHAR2(30) salariu NUMBER(12,3));

ALTER TABLE SALARIAT


MODIFY (prenume VARCHAR2(30)), MODIFY(salariu NUMBER(12,3));
ALTER TABLE SALARIAT
MODIFY (prenume VARCHAR2(30) , salariu NUMBER(12,3));

ALTER TABLE SALARIAT


ADD (prenume VARCHAR2(30), salariu NUMBER(12,3));

18. Care este varianta corecta pentru a crea tabelul Salariat, cu caracteristicile de mai jos?

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU

not null sir de sir caractere date, valoare numeric de 2 sir de valoare
numeric de 5 caractere de de maxim 20 implicita caractere de implicita 0
maxim 20 data curentã dimensiune numar de 10
fixa, de 30 cu 2
zecimale

CREATE TABLE SALARIAT (


cod_ang NUMBER(5) NOT NULL,
nume VARCHAR2(20),
prenume VARCHAR2(20),
data_angajarii DATE DEFAULT SYSDATE,
varsta NUMBER(2),
email CHAR(50),
salariu NUMBER(10,2) DEFAULT 0);

CREATE TABLE SALARIAT (


cod_ang NUMBER(5)
nume VARCHAR2(20),
prenume VARCHAR2(20),
data_angajarii DATE ,
varsta NUMBER(2),
email CHAR(50),
salariu NUMBER(10,2) DEFAULT 0);

CREATE TABLE SALARIAT (


cod_ang NUMBER(5) NOT NULL,
nume VARCHAR2(20),
prenume VARCHAR2(20),
data_angajarii DATE, DEFAULT SYSDATE,
varsta NUMBER(2),
email CHAR(50),
salariu NUMBER(10,2), DEFAULT 0);

19. Care varianta este corecta pentru a redenumi tabelul SALARIAT cu numele SALARIATI?

RENAME SALARIAT TO SALARIATI;


RENAME SALARIAT WITH SALARIATI;
RENAME TABLE SALARIAT TO TABLE SALARIATI;
RENAME TABLE SALARIAT WITH TABLE SALARIATI;

20. Care ste comanda corecta care afiseaza codul departamentelor pentru care salariul minim depaseste
5000$?

SELECT cod_departament
FROM salariat
WHERE MIN(salariu)>5000
GROUP BY cod_departament;

SELECT cod_departament
FROM salariat
GROUP BY cod_departament
HAVING MIN(salariu)>5000;

SELECT cod_departament
FROM salariat
GROUP BY cod_departament
MIN(salariu)>5000;

ALTE SUBIECTE TIMISOARA

Care este comanda corecta care afiseaza numele si salariul angajatilor condusi direct de Ionescu Mihai?
SELECT nume, salariu
FROM salariati
WHERE cod_sef = (SELECT cod_angajat FROM salariati
WHERE nume ='Ionescu' AND prenume ='Mihai' );
SELECT nume, salariu
FROM salariati
WHERE cod_sef = (SELECT cod_angajat FROM salariati
WHERE nume ='Ionescu', prenume ='Mihai' );
SELECT nume, salariu
FROM salariati
WHERE cod_sef = ‘Ionescu Mihai';
SELECT nume, salariu
FROM salariati
WHERE cod_sef != (SELECT cod_angajat FROM salariati
WHERE nume ='Ionescu' AND prenume ='Mihai' );

Ce comanda sterge din tabelul SALARIAT

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU


not null numeric de 5 sir de
caractere de
maxim 20 sir caractere de maxim 20 date, valoare implicita data curentã numeric de 2 sir de caractere de
dimensiune fixa, de 30 valoare implicita 0
numar de 10 cu 2 zecimale

coloana nume si coloana salariu?

ALTER TABLE SALARIAT


DROP nume, salariu;
ALTER TABLE SALARIAT
DROP COLUMN (nume, salariu);
ALTER TABLE SALARIAT
DROP (nume, salariu);
ALTER TABLE SALARIAT
DROP COLUMN nume, COLUMN salariu;

Care este comanda corecta care afiseaza numele salariatilor care lucreaza in departamentul 3 si au salariul >100 sau
care sunt din departamentul 5 si au salariul <200?
SELECT nume
FROM salariat
WHERE (cod_deptartament=3 OR salariu>100) AND (cod_deptartament=5 OR salariu<200);
SELECT nume
FROM salariat
WHERE (cod_deptartament=3 AND salariu>100) OR (cod_deptartament=5 AND salariu<200);
SELECT nume
FROM salariat
WHERE (cod_deptartament=3 AND salariu>100) AND (cod_deptartament=5 AND salariu<200);
SELECT nume
FROM salariat
WHERE (cod_deptartament=3 AND salariu>100) OR (cod_deptartament=5 OR salariu<200);

Care dintre urmatoarele comenzi intoarce numarul zilei din luna carespunzator datei curente?
SELECT TO_CHAR(SYSDATE,’DDD’)
FROM dual;
SELECT TO_CHAR(SYSDATE,’DAY’)
FROM dual;
SELECT TO_CHAR(SYSDATE,’D’)
FROM dual;
SELECT TO_CHAR(SYSDATE,’DD’)
FROM dual;

Care este comanda corecta care afiseaza numele salariatilor si numele departamentelor in care lucreaza, inclusiv
departamentele in care nu lucreaza salariati?

SELECT nume_salariat, nume_departament


FROM salariati s, departamente d
WHERE s.cod_departament = d.cod_departament;
SELECT nume_salariat, nume_departament
FROM salariati s, departamente d
WHERE s.cod_departament(+) = d.cod_departament;
SELECT nume_salariat, nume_departament
FROM salariati s, departamente d
WHERE s.cod_departament = d.cod_departament(+);
SELECT nume_salariat, nume_departament
FROM salariati s, departamente d
WHERE s.cod_departament(+) = d.cod_departament(+);
Pentru a insera in tabelul SALARIAT inregistrari,

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU


not null numeric de 5 sir caractere de maxim 20 sir caractere de maxim 20 date, valoare implicita data curentã
numeric de 2 sir de
caractere de dimensiune fixa, de 30 valoare implicita 0
numar de 10 cu 2 zecimale

care varianta este incorecta?


INSERT INTO SALARIAT(COD _ANG, NUME,PRENUME,DATA_ANG,VARSTA,EMAIL, SALARIU) VALUES(5,
‘Ene’, ‘Ana’, ‘1/06/2009’, 20, ‘INTERZIS PE FORUM CU ADRESE DE EMAIL.com’, 2500.50)
INSERT INTO SALARIAT(COD _ANG, NUME,PRENUME, VARSTA, EMAIL) VALUES(5, ‘Ene’, ‘Ana’, 20,
‘INTERZIS PE FORUM CU ADRESE DE EMAIL.com’)
INSERT INTO SALARIAT(COD _ANG, NUME,PRENUME,VARSTA,EMAIL, SALARIU) VALUES(5, ‘Ene’,
‘Ana’, ‘1/06/2009’, 20, ‘INTERZIS PE FORUM CU ADRESE DE EMAIL.com’)
INSERT INTO SALARIAT
VALUES(5, ‘Ene’, ‘Ana’, ‘1/06/2009’, 20, ‘INTERZIS PE FORUM CU ADRESE DE EMAIL.com’, 2500.50)

Ce comanda creeaza tabelul SALARIAT_1 care sã aiba aceeiasi structura cu


tabelul SALARIAT

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU


not null numeric de 5 sir de
caractere de
maxim 20 sir caractere de maxim 20 date, valoare implicita data curentã numeric de 2 sir de caractere de
dimensiune fixa, de 30 valoare implicita 0
numar de 10 cu 2 zecimale

si sa contina salariatii care au salariu >100?

CREATE TABLE SALARIAT_1


SELECT * FROM SALARIAT WHERE SALARIU>100;
CREATE TABLE SALARIAT_1 AS
SELECT * FROM SALARIAT WHERE SALARIU>100;
CREATE TABLE SALARIAT_1 AS
SELECT FROM SALARIAT WHERE SALARIU>100;
CREATE TABLE SALARIAT_1 AS
SELECT COD_ANG, SALARIU FROM SALARIAT WHERE SALARIU>100;

Care este comanda nu elimina simultan spatiile de la inceputul si sfarsitul coloanei nume?
SELECT TRIM(nume)
FROM salariat;
SELECT RTRIM(LTRIM(nume))
FROM salariat;
SELECT LTRIM(RTRIM(nume))
FROM salariat;
SELECT LTRIM(nume)
FROM salariat;

2. Care este comanda corecta care afiseaza toate functiile pe care nu lucreaza angazatii?

A SELECT cod_functie
FROM functii
WHERE cod_functie IN
(select cod_functie FROM salariati WHERE cod_functie IS NOT NULL)

B SELECT cod_functie
FROM functii
WHERE cod_functie NOT IN
(select cod_functie FROM salariati WHERE cod_functie IS NULL)
C SELECT cod_functie
FROM functii
WHERE cod_functie NOT IN
(select cod_functie FROM salariati)

D SELECT cod_functie
FROM functii
WHERE cod_functie NOT IN
(select cod_functie FROM salariati WHERE cod_functie IS NOT NULL)

Raspuns D.

ALTE TESTE

3-Care este comanda corecta care afiseaza numele cititorilor care au carti nerestituite?
SELECT nume_cititor
FROM imprumuta
WHERE data_restituirii = NULL;

SELECT nume_cititor
FROM imprumuta
WHERE data_restituirii IS NOT NULL;

SELECT nume_cititor
FROM imprumuta
WHERE data_restituirii IS NULL;

SELECT nume_cititor
FROM imprumuta
WHERE data_restituirii > SYSDATE;

6-Care comanda nu defineste corect un tabel?

CREATE TABLE [schema.]nume_tabel (


nume_coloana tip_de_date [DEFAULT expr], ...);

CREATE TABLE nume_tabel [(col1, col2...)]


AS subcerere;

CREATE TABLE [schema.]nume_tabel (


nume_coloana tip_de_date, [DEFAULT expr], [constrangere_de_coloana], ...);

CREATE TABLE [schema.]nume_tabel (


nume_coloana tip_de_date [DEFAULT expr] [constrangere_de_coloana], ...
..[constrangere la nivel de tabel])

8-Ce comanda creeaza corect tabelul SALARIAT, specificand constrangerile

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU


cheie primara numeric de 5 not null
sir decaractere demaxim 20 sir caractere de maxim 20 date, valoare
implicita data curentã numeric de 2 unic sir de caractere de dimensiune fixa, de 30 > 0
numar de 10 cu 2 zecimale
coloana nume si coloana salariu?

CREATE TABLE salariat(


cod_ang NUMBER(5) PRIMARY KEY,
nume VARCHAR2(20) NOT NULL,
prenume VARCHAR2(20),
data_ang DATE DEFAULT SYSDATE,
varsta NUMBER(2),
email CHAR(30) UNIQUE,
salariu NUMBER(10,2) CHECK (salariu > 0));
CREATE TABLE salariat(
cod_ang NUMBER(5) PRIMARY KEY,
nume VARCHAR2(20) NOT NULL,
prenume VARCHAR2(20),
data_ang DATE DEFAULT SYSDATE,
varsta NUMBER(2),
email CHAR(30) UNIQUE,
salariu NUMBER(10,2) > 0));

CREATE TABLE salariat(


cod_ang NUMBER(5) PRIMARY KEY,
nume VARCHAR2(20) NOT NULL,
prenume VARCHAR2(20),
data_ang DATE DEFAULT SYSDATE,
varsta NUMBER(2),
email CHAR(30),
salariu NUMBER(10,2) CHECK (salariu > 0));

9-Care este comanda corecta care afiseaza numele si salariul angajatilor condusi direct de ‘ENE DAN’?

SELECT nume, salariu


FROM salariati
WHERE cod_manager = (SELECT cod_manager FROM salariati
WHERE UPPER(nume) ='ENE' , UPPER(pren) ='DAN' );

SELECT nume, salariu


FROM salariati
WHERE cod_manager = (SELECT cod_ang FROM salariati
WHERE nume ='ENE' , pren ='DAN' );

SELECT nume, salariu


FROM salariati
(SELECT cod_ang FROM salariati
WHERE UPPER(nume) ='ENE' AND UPPER(pren) ='DAN' );

SELECT nume, salariu


FROM salariati
WHERE cod_manager = (SELECT cod_ang FROM salariati
WHERE UPPER(nume) ='ENE' AND UPPER(pren) ='DAN' );

10. Care este comanda corecta care afiseaza numarul total al cartilor imprumutate in anul 2008?

SELECT COUNT()
FROM imprumuta
WHERE TO_CHAR(data_imprumutului,’yyyy’)=2008;

SELECT COUNT(*)
FROM imprumuta
WHERE TO_CHAR(data_imprumutului,’yyyy’)=2008;

SELECT COUNT(*)
FROM imprumuta
WHERE data_imprumutului=2008;

SELECT COUNT(*)
FROM imprumuta
WHERE TO_CHAR(data_imprumutului,’yy’)=2008;

14-Care comanda listeaza numele tuturor angajatilor care au a treia litera din nume 'a'?

SELECT nume
FROM salariat
WHERE nume LIKE '__a$';

SELECT nume
FROM salariat
WHERE nume LIKE '%a%';
SELECT nume
FROM salariat
WHERE nume LIKE '__a%';

15-Care este comanda corecta care afiseaza toate departamentele care platesc salariatilor sai o suma mai
mare ca 20000?

SELECT nume_departament
FROM departament
WHERE 20000<
(SELECT sum(salariu) FROM salariat);

SELECT nume_departament
FROM departament A
WHERE 20000<
(SELECT sum(salariu) FROM salariat B
where cod_departament=cod_departament);

SELECT nume_departament
FROM departament
WHERE 20000<
(SELECT sum(salariu) FROM salariat
where A.cod_departament=B.cod_departament);

SELECT nume_departament
FROM departament A
WHERE 20000<
(SELECT sum(salariu) FROM salariat B
where A.cod_departament=B.cod_departament);

18-Care este comanda corecta care afiseaza codul departamentelor, numele departamentelor si suma salariilor
pentru fiecare departament?

SELECT cod_departament, nume_departament, SUM(salariu)


FROM salariati s, departamente d
GROUP BY cod_departament, nume_departament;

SELECT cod_departament, nume_departament, SUM(salariu)


FROM salariati s, departamente d
WHERE s.cod_departament=d.cod_departament
GROUP BY cod_departament;

SELECT cod_departament, nume_departament, SUM(salariu)


FROM salariati s, departamente d
WHERE s.cod_departament=d.cod_departament
GROUP BY cod_departament, nume_departament;

SELECT cod_departament, nume_departament, SUM(salariu)


FROM salariati, departamente
WHERE s.cod_departament=d.cod_departament
GROUP BY cod_departament, nume_departament;

19-Care este comanda corecta care sa afiseze daca exista angajati care nu lucreaza in departamentul
‘Contractari’ si al caror salariu coincide cu salariul unui angajat din departamentul ‘Contractari’?

SELECT nume, salariu, cod_depart


FROM salariati
WHERE salariu IN (SELECT salariu FROM salariati s, department d
WHERE s.cod_depart = d.cod_depart AND nume_depart <> ‘Contractari’)
AND cod_depart= (SELECT cod_depart FROM department
WHERE nume_depart = ‘Contractari’);

SELECT nume, salariu, cod_depart


FROM salariati
WHERE salariu IS IN (SELECT salariu FROM salariati s, department d
WHERE s.cod_depart = d.cod_depart , nume_depart = ‘Contractari’)
AND cod_depart<> (SELECT cod_depart FROM department
WHERE nume_depart = ‘Contractari’);

SELECT nume, salariu, cod_depart


FROM salariati
WHERE (salariu) IN (SELECT salariu FROM salariati s, department d
WHERE s.cod_depart = d.cod_depart AND nume_depart = ‘Contractari’)
AND cod_depart<> (SELECT cod_depart FROM department
WHERE nume_depart = ‘Contractari’);

70%

1. Care este comanda corecta care determina marirea salariul tuturor angajatilor din tabelul salariat cu
5%?

UPDATE salariu
SET salariu = salariu * 1.05;

UPDATE salariat
SET salariu = salariu * 1.05;
(varianta aleasa de mine)

UPDATE salariat
SET salariu = 1.05;

UPDATE salariat
SET salariu = salariu + salariu* 1.05;

2. Care este comanda corecta care afiseaza numele salariatilor care castiga mai mult decat salariul
mediu pe companie, in ordine crescatoare a salariului?

SELECT nume
FROM salariati
WHERE salariu >AVG(salariu);

SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati)
ORDER BY salariu;
(varianta aleasa de mine)

SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati
ORDER BY salariu);

SELECT nume
FROM salariati
WHERE salariu > (SELECT AVG(salariu) FROM salariati)
ORDER BY 1;

3. Ce comanda modifica in tabelul SALARIAT

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU

not null sir de sir caractere date, valoare numeric de 2 sir de valoare
numeric de 5 caractere de de maxim 20 implicita data caractere de implicita 0
maxim 20 curentã dimensiune numar de 10
fixa, de 30 cu 2 zecimale

dimensiunea coloanei nume la 30 si pe cea a coloanei salariu la 12 cu 3 zecimale?


ALTER TABLE salariat
MODIFY nume VARCHAR2(30), salariu NUMBER(12,3);

ALTER TABLE salariat


MODIFY nume VARCHAR2(30), salariu NUMBER(12,3);

ALTER TABLE salariat


MODIFY nume VARCHAR2(30), MODIFY salariu NUMBER(12,3);

ALTER TABLE salariat


MODIFY (nume VARCHAR2(30), salariu NUMBER(12,3));
(varianta aleasa de mine)

4. Actualizarile realizate asupra tabelelor de baza ale unei vizualizari se reflecta totdeauna in vizualizare

Adevărat
(varianta aleasa de mine)

5. Pentru a modifica dimensiunea coloanei prenume la 30 si pe cea a salariului la 12 cu 3 zecimale, din


tabelul SALARIAT

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU

not null sir de sir caractere date, valoare numeric de sir de valoare
numeric de caractere de de maxim 20 implicita data 2 caractere de implicita 0
5 maxim 20 curentã dimensiune numar de 10 cu 2
fixa, de 30 zecimale

care varienta este corecta?

ALTER TABLE SALARIAT


MODIFY (prenume VARCHAR2(30) salariu NUMBER(12,3));

ALTER TABLE SALARIAT


MODIFY (prenume VARCHAR2(30)), MODIFY(salariu NUMBER(12,3));

ALTER TABLE SALARIAT


MODIFY (prenume VARCHAR2(30) , salariu NUMBER(12,3));
(varianta aleasa de mine)

ALTER TABLE SALARIAT


ADD (prenume VARCHAR2(30), salariu NUMBER(12,3));

6. Care este varianta corecta pentru a crea tabelul Salariat, cu caracteristicile de mai jos?

COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL SALARIU

not null sir de sir caractere date, valoare numeric de 2 sir de valoare
numeric de 5 caractere de de maxim 20 implicita data caractere de implicita 0
maxim 20 curentã dimensiune numar de 10
fixa, de 30 cu 2 zecimale

CREATE TABLE SALARIAT (


cod_ang NUMBER(5) NOT NULL,
nume VARCHAR2(20),
prenume VARCHAR2(20),
data_angajarii DATE DEFAULT SYSDATE,
varsta NUMBER(2),
email CHAR(50),
salariu NUMBER(10,2) DEFAULT 0);
(varianta aleasa de mine)

CREATE TABLE SALARIAT (


cod_ang NUMBER(5)
nume VARCHAR2(20),
prenume VARCHAR2(20),
data_angajarii DATE ,
varsta NUMBER(2),
email CHAR(50),
salariu NUMBER(10,2) DEFAULT 0);

CREATE TABLE SALARIAT (


cod_ang NUMBER(5) NOT NULL,
nume VARCHAR2(20),
prenume VARCHAR2(20),
data_angajarii DATE, DEFAULT SYSDATE,
varsta NUMBER(2),
email CHAR(50),
salariu NUMBER(10,2), DEFAULT 0);

7. Care varianta este corecta pentru a redenumi tabelul SALARIAT cu numele SALARIATI?

RENAME SALARIAT TO SALARIATI;


(varianta aleasa de mine)

RENAME SALARIAT WITH SALARIATI;

RENAME TABLE SALARIAT TO TABLE SALARIATI;

RENAME TABLE SALARIAT WITH TABLE SALARIATI;

8. Care este comanda corecta care afiseaza numele si salariul angajatilor condusi direct de Ionescu
Mihai?

SELECT nume, salariu


FROM salariati
WHERE cod_sef = (SELECT cod_angajat FROM salariati
WHERE nume ='Ionescu' AND prenume ='Mihai' );
(varianta aleasa de mine)

SELECT nume, salariu


FROM salariati
WHERE cod_sef = (SELECT cod_angajat FROM salariati
WHERE nume ='Ionescu', prenume ='Mihai' );

SELECT nume, salariu


FROM salariati
WHERE cod_sef = ‘Ionescu Mihai';

SELECT nume, salariu


FROM salariati
WHERE cod_sef != (SELECT cod_angajat FROM salariati
WHERE nume ='Ionescu' AND prenume ='Mihai' );

9. Ce comanda sterge din tabelul SALARIAT COD _ANG NUME PRENUME DATA_ANG VARSTA EMAIL
SALARIU not null numeric de 5 sir de caractere de maxim 20 sir caractere de maxim 20 date, valoare
implicita data curentã numeric de 2 sir de caractere de dimensiune fixa, de 30 valoare implicita 0 numar
de 10 cu 2 zecimale coloana nume si coloana salariu?

ALTER TABLE SALARIAT


DROP nume, salariu;

ALTER TABLE SALARIAT


DROP COLUMN (nume, salariu);

ALTER TABLE SALARIAT


DROP (nume, salariu);
(varianta aleasa de mine)
ALTER TABLE SALARIAT
DROP COLUMN nume, COLUMN salariu;

10.Care este comanda corecta care afiseaza numele cititorilor care au carti nerestituite?

SELECT nume_cititor
FROM imprumuta
WHERE data_restituirii = NULL;

SELECT nume_cititor
FROM imprumuta
WHERE data_restituirii IS NOT NULL;

SELECT nume_cititor
FROM imprumuta
WHERE data_restituirii IS NULL;
(varianta aleasa de mine)

SELECT nume_cititor
FROM imprumuta
WHERE data_restituirii > SYSDATE;

11. Care comanda nu defineste corect un tabel?

CREATE TABLE [schema.]nume_tabel (


nume_coloana tip_de_date [DEFAULT expr], ...);

CREATE TABLE nume_tabel [(col1, col2...)]


AS subcerere;
(varianta aleasa de mine)

CREATE TABLE [schema.]nume_tabel (


nume_coloana tip_de_date, [DEFAULT expr], [constrangere_de_coloana], ...);

CREATE TABLE [schema.]nume_tabel (


nume_coloana tip_de_date [DEFAULT expr] [constrangere_de_coloana], ...
..[constrangere la nivel de tabel])

12. Care este comanda corecta care afiseaza numele si salariul angajatilor condusi direct de ‘ENE DAN’?

SELECT nume, salariu


FROM salariati
WHERE cod_manager = (SELECT cod_manager FROM salariati
WHERE UPPER(nume) ='ENE' , UPPER(pren) ='DAN' );

SELECT nume, salariu


FROM salariati
WHERE cod_manager = (SELECT cod_ang FROM salariati
WHERE nume ='ENE' , pren ='DAN' );

SELECT nume, salariu


FROM salariati
(SELECT cod_ang FROM salariati
WHERE UPPER(nume) ='ENE' AND UPPER(pren) ='DAN' );

SELECT nume, salariu


FROM salariati
WHERE cod_manager = (SELECT cod_ang FROM salariati
WHERE UPPER(nume) ='ENE' AND UPPER(pren) ='DAN' );
(varianta aleasa de mine)
13. Care comanda listeaza numele tuturor angajatilor care au a treia litera din nume 'a'?

SELECT nume
FROM salariat
WHERE nume LIKE '__a$';

SELECT nume
FROM salariat
WHERE nume LIKE '%a%';

SELECT nume
FROM salariat
WHERE nume LIKE '__a%';
(varianta aleasa de mine)

14.Care este comanda corecta care afiseaza codul departamentelor, numele departamentelor si suma
salariilor pentru fiecare departament?

SELECT cod_departament, nume_departament, SUM(salariu)


FROM salariati s, departamente d
GROUP BY cod_departament, nume_departament;

SELECT cod_departament, nume_departament, SUM(salariu)


FROM salariati s, departamente d
WHERE s.cod_departament=d.cod_departament
GROUP BY cod_departament;
(varianta aleasa de mine)

SELECT cod_departament, nume_departament, SUM(salariu)


FROM salariati s, departamente d
WHERE s.cod_departament=d.cod_departament
GROUP BY cod_departament, nume_departament;

SELECT cod_departament, nume_departament, SUM(salariu)


FROM salariati, departamente
WHERE s.cod_departament=d.cod_departament
GROUP BY cod_departament, nume_departament;

15. Care este comanda corecta care sa afiseze daca exista angajati care nu lucreaza in departamentul
‘Contractari’ si al caror salariu coincide cu salariul unui angajat din departamentul ‘Contractari’?

SELECT nume, salariu, cod_depart


FROM salariati
WHERE salariu IN (SELECT salariu FROM salariati s, department d
WHERE s.cod_depart = d.cod_depart AND nume_depart <> ‘Contractari’)
AND cod_depart= (SELECT cod_depart FROM department
WHERE nume_depart = ‘Contractari’);
(varianta aleasa de mine)

SELECT nume, salariu, cod_depart


FROM salariati
WHERE salariu IS IN (SELECT salariu FROM salariati s, department d
WHERE s.cod_depart = d.cod_depart , nume_depart = ‘Contractari’)
AND cod_depart<> (SELECT cod_depart FROM department
WHERE nume_depart = ‘Contractari’);

SELECT nume, salariu, cod_depart


FROM salariati
WHERE (salariu) IN (SELECT salariu FROM salariati s, department d
WHERE s.cod_depart = d.cod_depart AND nume_depart = ‘Contractari’)
AND cod_depart<> (SELECT cod_depart FROM department
WHERE nume_depart = ‘Contractari’);
16. Constringerea NOT NULL poate fi adaugata utilizind o comanda ALTER
TABLE…. ADD CONSTRAINT?
A - (varianta aleasa de mine)

17.O constrangere de tip PRIMARY KEY poate fi declarata numai la nivel de coloana
A - (varianta aleasa de mine)

18.Efectele unei comenzi DDL pot fi anulate cu o comanda ROLLBACK


F - (varianta aleasa de mine)

19.Care este comanda corecta care se afiseaza numele si prenumele pentru toti angajatii cu varsta
necunoscuta?

SELECT nume, prenume


FROM salariat
WHERE varsta=NULL;

SELECT nume, prenume


FROM salariat
WHERE varsta IS NULL;
(varianta aleasa de mine)

SELECT nume, prenume


FROM salariat
WHERE varsta=0;

SELECT nume, prenume


FROM salariat
WHERE varsta IS NOT NULL;

20.Care este comanda corecta care afiseaza numele si data angajarii pentru salariatii care au fost
angajati dupa angajatul avand codul 10, in ordine descrescatoare a numelui?

SELECT nume, data_angajarii


FROM salariat
WHERE data_angajarii >
(SELECT data_angajarii FROM salariat WHERE cod_angajat = 10);

SELECT nume, data_angajarii


FROM salariat
WHERE data_angajarii >
(SELECT data_angajarii FROM salariat WHERE cod_angajat = 10)
ORDER BY nume;

SELECT nume, data_angajarii


FROM salariat
WHERE data_angajarii >
(SELECT data_angajarii FROM salariat WHERE cod_angajat = 10)
ORDER BY nume DESC;
(varianta aleasa de mine)

SELECT nume, data_angajarii


FROM salariat
WHERE data_angajarii >
(SELECT * FROM salariat WHERE cod_angajat = 10)
ORDER BY nume DESC;

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