Professional Documents
Culture Documents
DECLARE
v_x NUMBER(9,2):=10;
v_y NUMBER(9,2);
v_message VARCHAR2(20);
BEGIN
A 10 v_y:= NULL; c
IF v_x !=v_y THEN
v_message := ‘ NOT EQUAL’;
ELSE v_message := ‘EQUAL’;
END IF;
DBMS_OUTPUT.PUT_LINE(v_message);
END;
c. EQUAL
Care din urmatoarele declaratii de valabilitate este corecta?
b. v_id_student NUMBER(5);
A 2 b
v_nume_student VARCHAR2(35) NOT NUL:=’Ionescu’;
v_prenume_student studenti.prenume%TYPE;
v_data DATE:=SYSDATE+1;
Care dintre urmatoarele afirmatii este corecta?
A 38 a
a. Blocul PL/SQL care descrie actiunea unui trigger nu poate contine
comanda COMIT
Care dintre urmatoarele afirmatii nu este corecta?
A 37 d
d. Un trigger la nivel de linie este executat o singura data, indiferent de
numarul de linii afectate de comanda declansatoare
1 din 29
Care dintre urmatoarele blocuri se executa cu erori?
d. DECLARE
alfa interval month;
A 14 d
BEGIN
alfa :=interval ‘8’ month;
DBMS_OUTPUT.PUT_LINE(‘alfa = ‘|| alfa);
END;
Care dintre urmatoarele variante apeleaza corect functia F_TEST care are
un singur parametru numeric?
A 28 a
a. SELECT F_TEST (80)
FROM DUAL ;
Care dintre urmatoarele vizualizari poate fi folosita în urmatoarea coman-
da pentru a vizualiza codul complet al subprogramului P1:
A 29 SELECT TEXT d
FROM ….
WHERE NAME = UPPER(’P1’);
d. USER_SOURCE
Care este varianta corecta care defineste un trigger la nivel de comanda
ce determina inserarea în tabelul audit_angajati a unui mesaj corespunza-
tor tipului de comanda LMD executata asupra tabelului angajati?
2 din 29
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;
A 21 a
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;
Care este varianta corecta pentru a crea specificatia unui pachet, care de-
fineste un cursor pentru obtinerea datelor şi o procedura ce actualizeaza
câmpul id_job al unui angajat cu un anumit cod?
3 din 29
Care este varianta corectă pentru a defini doi vectori avand dimensiunea
maximă 3, iniţializaţi prin liste de valori, şi un al treilea, care va avea ca
elemente, produsul pe componente a celor doi vectori?
a. DECLARE
TYPE vector IS VARRAY(3) OF NUMBER
v_1 vector :=vector(1,2,3); v_2 vector :=vector(100,200,300)
v_produs vector :=vector();
BEGIN
FOR i in 1..3 LOOP
v_produs(i)* v_2(i)
END LOOP;
END
b. DECLARE
TYPE vector IS VARRAY(3) OF NUMBER
C 3 v_1 vector :=vector(1,2,3); v_2 vector :=(100,200,300) ?
v_produs vector:=vector();
BEGIN
FOR i in 1..3 LOOP
v_produs.EXTEND; v_produs(i):=v_1(i)* v_2(i);
END LOOP;
END
c. DECLARE
TYPE vector IS VARRAY(3) OF NUMBER
v_1 vector:=vector(1,2,3); v_2 vector:=vector(100,200,300)
v_produs vector:=vector();
BEGIN
FOR i in 1:3 LOOP
v_produs(i) :=v_produs(i)* v_1(i)* v_2(i)
END LOOP;
END
Care este varianta corecta pentru a defini un tablou imbricat de numere
care are ca elemente primele 10 numere naturale?
b. DECLARE
TYPE tablou IS TABLE OF NUMBER;
A 19 b
tab tablou:= tablou();
BEGIN FOR i IN 1…10 LOOP
tab.EXTEND; tab(i) := i;
END LOOP;
END;
4 din 29
Care este varianta corecta pentru afisarea variabilei v_mesaj ?
5 din 29
Care este varianta corecta prin care se afiseaza numele şi prenumele pri-
melor 5 persoane angajate în luna martie în anul 1997?
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’
A 25 b
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;
Care este varianta corecta prin care se incarca date dintr-un cursor într-o
colectie?
b. DECLARE
TYPE tip_job IS TABLE OF joburi.nume_job%TYPE;
v_nume tip_job;
A 23 b
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;
Care este varianta de bloc PL/SQL corecta pentru a mentine intr-un vec-
tor codurile angajatilor care au salariul mai mic decat 20000 şi lucreaza
în departamentul 90?
b. DECLARE
TYPE t_id IS VARRAY(100) OF angajati.id_angajat%TYPE;
A 20 b
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;
6 din 29
Care este varianta incorecta prin care se obtin numele şi salariul angajati-
lor care au salariul mai mic decat 2500 şi nu lucreaza în departamentul a-
vand 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; b
DBMS_OUTPUT.PUT_LINE(‘Salariatul ’||v_nume||’ are a
A 24
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;
Care tabel / vizualizare poate fi folosit/folosita în urmatoarea comanda
pentru a obtine informatii despre procedurile şi functiile detinute de utili-
zatorul curent?
A 32 SELECT * d
FROM …..
WHERE OBJECT_TYPE IN (‘PROCEDURE’ , ‘FUNCTION’);
d. USER_OBJECTS
7 din 29
Ce comanda SQL*Plus ar putea sa preceada blocul de mai jos pentru ca
în acesta să se utilizeze valoarea data variabilei sem ?
DECLARE
v_sem CHAR(2):=UPPER(‘&sem’);
BEGIN
CASE v_sem a
A 15
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=’
Ce trebuie adaugat la linia 11 pentru ca în următorul bloc PL/SQL să se
foloseasca corect cursorul?
1. DECLARE
2. CURSOR c_ang IS
3. SELECT *
4. FROM angajati
5. WHERE TO_CHAR(data_angajarii,’YYYY’)=2000
A 35 6. FOR UPDATE OF salariu NOWAIT; b
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;
b. WHERE CURRENT OF c_ang;
8 din 29
Ce trebuie adaugat la linia 9 pentru ca urmatoarea functie sa fie corect
creata?
9 din 29
Codul sursa de mai jos defineste un pachet cu ajutorul caruia, utilizand un
subprogram functie şi un cursor, se poate obtine salariul minim inregistrat
pentru angajati şi lista angajatilor care au salariul mai mare sau egal decat
acel minim +1000.
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;
10 din 29
Codul următor:
DECLARE
PROCEDURE p1(val NUMBER)
IS
BEGIN
UPDATE angajaţi
SET salariu=salariu+val
WHERE cod_departament=10; ?
C 1
END; c
BEGIN
p1(700);
END
B 9 SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE('Invat PL/SQL');
END;
/
Creaţi un bloc anonim care să afiseze propoziţia "Invat PL/SQL" pe
ecran. Varianta 1 — Afisare folosind variabile de legătură
DECLARE
v_nume, v_prenume VARCHAR2(35);
B 4
Corect:
DECLARE
v_nume VARCHAR2(35);
v_prenume VARCHAR2(35);
11 din 29
Evaluati următoarele declaratii de variabile:
DECLARE
B 5 v_nr NUMBER(5,2) = 10;
Corect:
DECLARE
v_nr NUMBER(5,2) := 10;
Evaluati următoarele declaratii de variabile:
DECLARE
B 6 v_test BOOLEAN:= SYSDATE;
Corect:
DECLARE
v_test BOOLEAN:=TRUE;
Evaluati următoarele declaratii de variabile:
DECLARE
v1 NUMBER(5) :=10;
v2 NUMBER(5) :=15;
B 7 v3 NUMBER(5) := v1< v2;
Corect:
DECLARE
v1 NUMBER(5) :=10;
v2 NUMBER(5) :=15;
v3 BOOLEAN := v1< v2;
În blocul PL/SQL de mai jos
apare:
c. un cursor implicit
Parametrii unei functii pot fi:
A 27 b
b. Numai de intrare (IN)
12 din 29
Pentru ca următorul bloc PL/SQL sa fie corect şi sa afiseze codul, salaria-
tul şi jobul angajatului cu codul 100, trebuie adaugat la linia 10 următorul
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;
A 12 c
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 ‘ şi jobul ‘ || v_ang.job || ‘ are salariul ‘ || v_ang.sal);
14 END;
c. RETURNING id_angajat, salariu, id_job
Pentru ca următorul bloc PL/SQL sa fie corect trebuie adaugat la linia 8
următorul cod:
13 din 29
Pentru ca următorul bloc PL/SQL sa fie corect trebuie adaugat la linia 6
următorul cod:
1 DECLARE
2 TYPE typetablou IS TABLE OF NUMBER;
3 tablou typetablou:= typetablou();
A 13 4 BEGIN a
5 FOR i IN 1..10 LOOP
6
7 tablou(i) :=i;
8 END LOOP;
9 END;
a. tablou.EXTEND
Să se creeze tabelul test_***(cod NUMBER(4)). Să se introducă în tabe-
lul test_*** 5 înregistrări, pentru care codul va fi generat printr-un con-
tor.
DECLARE
v_contor NUMBER(6) := 1;
BEGIN
B 15 LOOP
INSERT INTO test_*** VALUES (v_contor);
v_contor := v_contor + 1;
EXIT WHEN v_contor > 5;
END LOOP;
END;
/
Să se creeze tabelul test_***(cod NUMBER(4)). Să se introducă în tabe-
lul test_*** 5 înregistrări, pentru care codul va fi generat printr-un con-
tor. Să se rezolve cerinţa folosind comanda WHILE … LOOP.
DECLARE
v_contor NUMBER(6) := 1;
BEGIN
B 16
WHILE v_contor < 6
LOOP
INSERT INTO test_*** VALUES (v_contor);
v_contor := v_contor + 1;
END LOOP;
END;
/
14 din 29
Să se creeze un bloc anonim în care se declară o variabilă v_job de tip
job_title (%TYPE) a cărei valoare va fi titlul jobului salariatului având
codul 200.
DECLARE
v_job jobs.job_title%TYPE;
BEGIN
B 1 SELECT job_title
INTO v_job
FROM employees e, jobs j
WHERE e.job_id=j.job_id
AND employee_id=200;
DBMS_OUTPUT.PUT_LINE('jobul este '|| v_job);
END;
/
Să se creeze un bloc anonim în care se declară o variabilă v_job de tip
job_title (%TYPE) a cărei valoare va fi titlul jobului salariatului având
codul 200.
DECLARE
v_job jobs.job_title%TYPE;
BEGIN
B 10 SELECT job_title
INTO v_job
FROM employees e, jobs j
WHERE e.job_id=j.job_id
AND employee_id=200;
DBMS_OUTPUT.PUT_LINE('jobul este '|| v_job);
END;
/
15 din 29
Să se creeze un bloc anonim în care se declară o variabilă v_job de tip
job_title (%TYPE) a cărei valoare va fi titlul jobului salariatului având
codul 200.
DECLARE
v_emp_hiredate employees.hire_date%TYPE;
v_emp_salary employees.salary%TYPE;
BEGIN
B 3 hire_date, salary
INTO v_emp_hiredate, v_emp_salary
FROM employees
WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE('Data_angajarii este: ' ||
v_emp_hiredate ||
' şi Salariu este: ' || v_emp_salary);
END;
/
16 din 29
Să se creeze un bloc anonim prin care în functie de abrevierea anotimpu-
rilor (P, V, T, I) introdusă de utilizator, se afisează un mesaj care specifi-
ca anotimpul respectiv.
17 din 29
Să se introducă în structura tabelului salariat_*** câmpul stea. Să se cre-
eze un bloc PL/SQL care va reactualiza acest câmp, introducând o steluţă
pentru fiecare 1000$ din valoarea salariului unui angajat al cărui cod este
specificat.
c. DECLARE
A 16 v_contor NUMBER(2) := 1; c
BEGIN
FOR i IN 1…5 LOOP
INSERT INTO testare VALUES (v_contor);
END LOOP;
END;
18 din 29
Să se rezolve problema anterioară utilizând variabile de legătură. Să se
afişeze rezultatul atât din bloc, cât şi din exteriorul acestuia.
19 din 29
Scrieţi un bloc PL/SQL în care stocaţi salariul unui angajat într-o variabi-
lă de substituţie. În partea executabilă a blocului să se calculeze salariul
anual şi bonusul pe care îl primeste salariatul (dacă salariul anual >=
20000 atunci bonusul este 2000, dacă salariul anual este cuprins între
10000 şi 20000 bonusul este 1000, iar dacă salariul anual < 10000 atunci
bonusul este 500. Să se afiseze bonusul.
20 din 29
Se dă următorul 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;
a
A 5 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;
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
A 18 v_tablour(i) := NULL; c
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;
În urma executiei blocului se obtine următorul rezultat:
DECLARE
carte VARCHAR2(20);
autor VARCHAR(15) DEFAULT 'Eminescu' ;
BEGIN
A 3 d
DBMS_OUTPUT.PUT_LINE(carte||' '||autor);
END;
22 din 29
Se dă următorul bloc PL/SQL:
DECLARE
nume VARCHAR2(15);
v_nr INTEGER;
BEGIN
SELECT LENGTH(nume) INTO v_nr
A 4 b
FROM dual;
DBMS_OUTPUT.PUT_LINE('Sirul are '||v_nr||'caractere');
END;
BEGIN
SELECT nume_job
INTO :rezultat
FROM angajat a, joburi b
WHERE a.id_job=b.id_job
A 6 AND id_angajat=100; b
DBMS_OUTPUT_LINE('Numele jobului este'|| :rezultat);
END;
23 din 29
Se dă următorul 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
A 7 d
DBMS_OUTPUT.PUT_LINE (‘Nu exista un angajat cu acest cod’);
ELSE
COMMIT;
DBMS_OUTPUT.PUT_LINE (‘Actualizare realizata’);
END IF;
END;
24 din 29
Se dă următorul 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
A 26 INSERT INTO informatii (nume_angajat, data_angajarii) a
VALUES (v_nume, v_data);
EXIT WHEN c%NOTFOUND;
END LOOP;
COMMIT;
END;
25 din 29
Se dă urmatorul bloc PL-SQL:
DECLARE
TYPE typetablou IS TABLE OF NUMBER;
tablou typetablou:=typetablou();
BEGIN
FOR; IN 1..10 LOOP
tablou(i):=i;
END LOOP;
DBMS_OUTPUT.PUT_LINE (Tabloul are’||tablou.COUNT||’elemente’);
FOR:in tablou.FIRST..tablou.LAST LOOP
tablou(i):=NULL;
END LOOP;
DBMS_OUTPUT.PUT_LINE(Tabloul are’||tablou.COUNT||’elemente’);
tablou.TRIM(tablou.COUNT);
?
C 2 DBMS_OUTPUT.PUT_LINE(Tabloul are’||tablou.COUNT||’elemente’);
c
END;
b. Nu afiseaza nimic
d. EROARE
26 din 29
Se defineste un trigger care determina inserarea unei linii în tabelul anga-
jati_log atunci cand salariul unui angajat este marit. Care dintre urmatoa-
rele variante este corecta?
Care este varianta corecta prin care se defineste un trigger care va deter-
mina incrementarea cu 1, a numarului de angajati din tabelul dept daca în
vizualizare este inserata o inregistrare, respective decrementarea cu 1 a
numarului de angajati din tabelul dept daca din vizualizare este stearsa o
A 42 inregistrare? b
27 din 29
Se presupune ca asupra tabelului angajati au fost definiti urmatorii 4
triggeri LMD:
c. Trigger1 - 0
Trigger2 - 1
Trigger3 - 3
Se presupune că într-o sală a unui muzeu pot fi expuse maximum 10 ope-
re de artă. Pentru aceasta, se creează următorul trigger:
28 din 29
Urmatoarea comanda creaza tabelul audit :
29 din 29