Documente Academic
Documente Profesional
Documente Cultură
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
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;
28. Care dintre urmatoarele variante apeleaza corect functia F_TEST care are un
singur parametru numeric?
a. v 1. v2VARCHAR2(35);
v3 CHAR(10):=’Valid’;
v4 DATE DEFAULT SYSDATE;
b. v1 NUMBER(5,2)=10,25;
v2 BOOLEAN:=10<20;
v3 DATE=SYSDATE;
c. v1 CHAR(10):=’Informatica’ .
v2 NUMBER(2) NOT NULL=10;
v3 VARCHAR2(20):= ’Matematica’;
29. Care dintre urmatoarele vizualizari poate fi folosita in urmatoarea comanda
pentru a vizualiza codul complet al subprogramului P1:
SELECT TEXT
FROM ….
WHERE NAME = UPPER(’P1’);
a. USER_OBJECTS
b. USER_ERRORS
c. USER_FUNCTIONS
d. USER_SOURCE
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;
15[1] Care este varianta corecta prin care se obtine pentru fiecare department
fisa angajatilor care lucreaza in acesta in rezultat incluzandu-se si departamentele
in care nu lucreaza nimeni?
a. BEGIN
FOR d IN(SELECT nume_departament FROM departamente)LOOP
BDMS_OUTPUT.PUT_LINE(’Departamentul’|| d nume_departament);
FOR a IN(SELECT erase FROM angajati)LOOP
DBMS_OUTPUT.PUT_LINEA(’Angajatul’||a.nume);
END LOOP;
END LOOP;
END;
b. BEGIN
FROM d IN( departamente d angajati a
WERE d id_departament=a id_departament)LOOP
DBMS_OUTPUT.PUT_LINE(’Departamentul’|| d nume_departament);
DBMS_OUTPUT.PUT_LINEA(’Angajatul’||d.nume);
END LOOP;
END;
c. BEGIN
FOR d IN(SELECT nume_departament, id_departament FROM
departamente)LOOP
BDMS_OUTPUT.PUT_LINE(’Departamentul’|| d. nume_departament);
FOR a IN( SELECT nume FROM angajati
WERE id_departament=d. id_departament)LOOP
DBMS_OUTPUT.PUT_LINEA(’Angajatul’||a.nume);
END LOOP;
END LOOP;
END;
20. Care este varianta de bloc PL/SQL corecta pentru a mentine intr-un vector
codurile angajatilor care au salariul mai mic decat 20000 si lucreaza in
departamentul 90?
a. 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?
a. DECLARE
TYPE tip_job IS TABLE OF joburi.nume_job%TYPE;
v_nume tip_job;
CURSOR c_joburi IS SELECT nume_job FROM joburi;
BEGIN
OPEN c_joburi;
SELECT c_joburi INTO v_nume;
CLOSE c_joburi;
END;
b. DECLARE
TYPE tip_job IS TABLE OF joburi.nume_job%TYPE;
v_nume tip_job;
CURSOR c_joburi IS SELECT nume_job FROM joburi;
BEGIN
OPEN c_joburi;
FETCH c_joburi BULK COLLECT INTO v_nume;
CLOSE c_joburi;
END;
c. DECLARE
TYPE tip_job IS TABLE OF joburi.nume_job%TYPE;
v_nume tip_job;
CURSOR c_joburi IS SELECT nume_job FROM joburi;
BEGIN
OPEN c_joburi;
FETCH c_joburi INTO v_nume;
CLOSE c_joburi;
END;
34. Care este varianta corecta pentru a crea specificatia unui pachet, care
defineste un cursor pentru obtinerea datelor si o procedura ce actualizeaza campul
id_job al unui angajat cu un anumit cod?
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;
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?
25. Care este varianta corecta prin care se afiseaza numele si prenumele primelor
5 persoane angajate in luna martie in anul 1997?
a. DECLARE
v_nume angajati.nume%TYPE; v_prenume angajati.prenume%TYPE;
CURSOR c IS
SELECT nume, prenume FROM angajati
WHERE TO_CHAR(data_angajarii, MM-YYYY)=03-1997
ORDER BY data_angajarii ASC;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_nume, v_prenume;
EXIT WHEN c%ROWCOUNT>5;
DBMS_OUTPUT.PUT_LINE(v_nume||’ ‘|| v_prenume);
END LOOP;
CLOSE c;
END;
b. DECLARE
v_nume angajati.nume%TYPE; v_prenume angajati.prenume%TYPE;
CURSOR c IS
SELECT nume, prenume FROM angajati
WHERE TO_CHAR(data_angajarii, ‘MM-YYYY’)=’03-1997’
ORDER BY data_angajarii;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_nume, v_prenume;
EXIT WHEN c%ROWCOUNT>5 OR c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_nume||’ ‘|| v_prenume);
END LOOP;
CLOSE c;
END;
c. DECLARE
v_nume angajati.nume%TYPE; v_prenume angajati.prenume%TYPE;
CURSOR c IS
SELECT nume, prenume FROM angajati
WHERE TO_CHAR(data_angajarii, ‘MM-YYYY’)=’03-1997’
ORDER BY data_angajarii DESC;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_nume, v_prenume;
EXIT WHEN c%ROWCOUNT<5 AND c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_nume||’ ‘|| v_prenume);
END LOOP;
END;
EX. Care este varianta corecta de definire a unui pachet care contine o constanta
avand valoarea 600 si o functie care verifica, folosind acea constanta, daca un
angajat lucreaza in companie de mai mult de 50 de ani?
EX. 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
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
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;
a. USER_SOURCE
b. DUAL
c. USER_ERRORS
d. USER_OBJECTS
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. Univ. Bucuresti
b. Univ. Spiru Haret
c. Eroare intoarsa de sistem
d. Este o eroare
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;
DECLARE
PROCEDURE p1(val NUMBER)
IS
BEGIN
UPDATE angajaţi
SET salariu=salariu+val
WHERE cod_departament=10;
END;
BEGIN
p1(700);
END
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;
apare:
a. un cursor explicit
b. nu apare nici un cursor
c. un cursor implicit
d. un ciclu cursor cu subcereri
SQL> DECLARE
2 v_job joburi.nume_job%TYPE;
3 BEGIN
4 SELECT nume_job
5 INTO v_job
6 FROM angajati a, joburi j
7
8 DBMS_OUTPUT.PUT_LINE('jobul este '|| v_job);
9 END;
a. WHERE id_angajat=200;
b. WHERE v_job.id_job=j.id_job AND id_angajat=200;
c. WHERE a.id_job=j.id_job AND id_angajat=200;
d. WHERE a.job_id=v_job.id_job AND id_angajat=200;
EX. Pachetul ang_pkg, a carui spacificatie este data mai jos, contine trei proceduri
overload, denumite gasire_ang.
Parametrii lor de intrare sunt de diferite tipuri de date.
11. Pentru ca urmatorul bloc PL/SQL sa fie corect trebuie adaugat la linia 8
urmatorul cod:
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
EX.12 Pentru ca urmatorul bloc PL/SQL sa fie corect si sa afiseze codul, salariul si
jobul angajatului cu codul 100, trebuie adaugat la linia 8 urmatorul cod:
SQL> DECLARE
2 TYPE typeang IS RECORD ( cod angajati.id_angajat%TYPE,
3 sal angajati.salariu%TYPE, job angajati.id_job%TYPE);
4 v_ang typeang;
5 BEGIN
6 DELETE FROM angajati
7 WHERE id_angajat=100
8 ………………………………………………………..
9 INTO v_ang;
10 DBMS_OUTPUT.PUT_LINE (' Angajatul cu codul :'|| v_ang.cod ||
11 ' si jobul ' || v_ang.job || ' are salariul ' || v_ang.sal);
12 END;
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;
EX.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 acesta functie?
EX. .Se da procedura de mai jos, care afla pentru un anume angajat numele si
salariul acestuia.
Stiind ca in tabelul angajati exista angajatul cu codul 100 care are un salariu de
5000 care din urmatoarele afirmatii sunt adevarate?
DECLARE
carte VARCHAR2(20);
autor VARCHAR(15) DEFAULT 'Eminescu' ;
BEGIN
DBMS_OUTPUT.PUT_LINE(carte||' '||autor);
END;
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;
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;
a. Blocul se executa fara erori si afiseaza numele jobului angajatului avand codul
100.
b. Valoarea variabilei de legatura rezultat nu poate fi afisata decat din interiorul
blocului PL/SQL.
c. Executia blocului se incheie cu o eroare, deoarece utilizarea clauzei INTO a
comenzii SELECT nu este corecta.
d. Executia blocului se incheie cu o eroare, deoarece variabila de legatura rezultat
nu este declarata in afara blocului 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;
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;
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:
DECLARE
nr NUMBER(4) ;
suma NUMBER(4);
info VARCHAR2(50) ;
BEGIN
nr:=0 ;
FOR i IN (SELECT nume_departament nd, nume n, salariu
FROM departmente d, angajati a
WHERE a.id department(+) = d.id department
AND a.id_departament IS NULL) LOOP
nr:=nr+1;
info :=i.nd| |’ ‘| |i.n;
suma:=suma+ i.salariu;
END LOOP;
DBMS_OUTPUT.PUT_LINE(nr);
DBMS_OUTPUT.PUT_LINE(suma);
DBMS_OUTPUT.PUT_LINE(info);
END;
In urma executiei acestui bloc
a. apare o eroare
b. variabila nr va avea ca valoare numarul de departamente in care nu
lucreaza angajati;
variabila suma va avea valoarea null;
variabila info va mentine informatii corespunzatoare ultimei linii
intoarse de comanda SELECT.
c. variabila nr va avea ca valoare numarul total de angajati;
variabila suma va avea valoarea null;
variabila info va mentine informatii corespunzatoare tuturor liniilor
intoarse de comanda SELECT
d. variabila nr va avea ca valoare numarul total de departamente in care
lucreaza angajati;
variabila suma ca valoare suma salariilor tuturor angajatilor;
variabila info va mentine informatii corespunzatoare primei linii intoarse
de comanda SELECT.
EX. Se da urmatorul bloc PL/SQL
DECLARE
TYPE typetablou IS TABLE OF NUMBER;
tablou typetablou:= typetablou();
BEGIN
FOR i IN 1..10 LOOP
tablou.EXTEND;
tablou(i) :=i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('tabloul are ' || tablou.COUNT || ' elemente');
FOR i IN tablou.FIRST..tablou.LAST LOOP
tablou(i) := NULL;
END LOOP;
DBMS_OUTPUT.PUT_LINE('tabloul are ' || tablou.COUNT || ' elemente');
tablou.TRIM(tablou.COUNT);
DBMS_OUTPUT.PUT_LINE('tabloul are ' || tablou.COUNT || ' elemente');
END;
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. BEGIN
dept_pkg.add_dept(’Training’);
END;
b. BEGIN
Dept_pkg.add_dept(100,’Training’);
END;
c. Eroare, nu apeleaza nici o procedura
d. BEGIN
Dept_pkg.add_dept (‘Training’,100);
16. Sa se introduca in tabelul testare(cod NUMBER(2)) 5 inregistrari, avand
codurile egale cu 1, 2, 3, 4 respectiv 5. Care din urmatoarele variante nu executa
acest deziderat?
a. DECLARE
v_contor NUMBER(2) := 1;
BEGIN
LOOP
INSERT INTO testare VALUES (v_contor);
v_contor :=v_contor + 1;
EXIT WHEN v_contor > 5;
END LOOP;
END;
b. DECLARE
v_contor NUMBER(2) := 1;
BEGIN
WHILE v_contor < 6 LOOP
INSERT INTO testare VALUES (v_contor);
v_contor :=v_contor + 1;
END LOOP;
END;
c. DECLARE
v_contor NUMBER(2) := 1;
BEGIN
FOR i IN 1..5 LOOP
INSERT INTO testare VALUES (v_contor);
END LOOP;
END;
d. BEGIN
FOR i IN 1..5 LOOP
INSERT INTO testare VALUES (i);
END LOOP;
END;
41. Se defineste un trigger care determina inserarea unei linii in tabelul
angajati_log atunci cand salariul unui angajat este marit. Care dintre urmatoarele
variante este corecta?
a. CREATE TRIGGER trigger_salariu
AFTER UPDATE OF salariu ON angajati
FOR EACH ROW
BEGIN
IF :NEW.salariu>:OLD.salariu THEN
INSERT INTO angajati_log (utilizator, data, angajat, salariu_vechi,
salariu_nou)
VALUES (USER, SYSDATE, :OLD.id_angajat, :OLD.salariu, :NEW.salariu);
END IF;
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;
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
Trigger4 - 0
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:
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. 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”.
a. Variabila de substitutie.
b. De tip record.
c. Variabila de legatura.
d. De tip varray.
1. Care nu este varianta corecta de cod PL/SQL care sterge din tabelul
joburi, joburile pentru care salariul minim este 4000 sau 8200, daca
aceste valori sunt mentinute intr-un vector?
a.
DECLARE
TYPE min_sal IS VARRAY(20) OF NUMBER;
v_min_sal min_sal:= min_sal(4000,8200);
BEGIN
FOR i IN v_min_sal.FIRST..v_min_sal.LAST LOOP
DELETE FROM joburi
WHERE salariu_min = v_min_sal(i);
END LOOP;
END;
b.
DECLARE
TYPE min_sal IS VARRAY(20) OF NUMBER;
v_min_sal min_sal:= min_sal(4000,8200);
BEGIN
FORALL i IN v_min_sal.FIRST..v_min_sal.LAST
DELETE FROM joburi
WHERE salariu_min = v_min_sal(i);
END;
c.
DECLARE
TYPE min_sal IS VARRAY(20) OF NUMBER;
v_min_sal min_sal;
BEGIN
FORALL i IN v_min_sal.FIRST..v_min_sal.LAST
DELETE FROM joburi
WHERE salariu_min = v_min_sal(i);
END;
a.
c_valoare CONSTANT NUMBER;
v_cod_dep departamente.id_departament%TYPE;
v_dep departamente%ROWTYPE :=10,'Vanzari',101,'Bucuresti';
b.
c_valoare CONSTANT NUMBER := 1000;
v_cod_dep departamente%TYPE;
v_ang angajati%ROWTYPE;
c.
c_valoare CONSTANT NUMBER := 1000;
v_cod_dep departamente.id_departament%TYPE;
v_dep departamente%ROWTYPE;
a.
VARIABLE v_mesaj VARCHAR2(50)
BEGIN
:v_mesaj := ' Invat PL/SQL ';
END;
/
PRINT &v_mesaj
b.
VARIABLE v_mesaj VARCHAR2(50)
BEGIN
:v_mesaj := ' Invat PL/SQL ';
PRINT v_mesaj;
END;
/
c.
VARIABLE v_mesaj VARCHAR2(50)
BEGIN
:v_mesaj := ' Invat PL/SQL ';
DBMS_OUTPUT.PUT_LINE(:v_mesaj);
END;
/
a.
DECLARE
v_nume angajati.nume%TYPE; v_prenume angajati.prenume%TYPE;
CURSOR c IS
SELECT nume, prenume FROM angajati
WHERE TO_CHAR(data_angajarii,'MM-YYYY') = '03-1997'
ORDER BY data_angajarii;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_nume,v_prenume;
EXIT WHEN c%ROWCOUNT>5 OR c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_nume || ' '||v_prenume);
END LOOP;
CLOSE c;
END;
b.
DECLARE
CURSOR c IS
SELECT nume v_nume, prenume v_prenume FROM angajati
WHERE TO_CHAR(data_angajarii,'MM-YYYY') ='03-1997'
ORDER BY data_angajarii ASC;
BEGIN
FOR i IN c LOOP
DBMS_OUTPUT.PUT_LINE(c.v_nume || ' '||c.v_prenume);
END LOOP;
END;
c.
BEGIN
FOR c IN (SELECT * FROM (
SELECT nume v_nume, prenume v_prenume FROM angajati
WHERE TO_CHAR(data_angajarii,'MM-YYYY') = '03-1997'
ORDER BY data_angajarii DESC)
WHERE ROWNUM<=5) LOOP
DBMS_OUTPUT.PUT_LINE(c.v_nume || ' '||c.v_prenume);
END LOOP;
END;
5.Care este varianta corecta pentru crearea unui cursor explicit care sa
afiseze, ID-ul, numele si salariul angajatilor care lucreaza in
departamentul 30?
a.
DECLARE
CURSOR ang_cursor IS
SELECT nume, salariu FROM angajati
WHERE id_departament =30;
v_ang_id angajati.id_angajat%TYPE;
v_nume angajati.nume%TYPE;
v_sal angajati.salariu%TYPE;
BEGIN
OPEN ang_cursor;
LOOP
FETCH ang_cursor INTO v_ang_id, v_nume, v_sal;
EXIT WHEN ang_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_nume||' '||v_sal);
END LOOP;
END;
b.
DECLARE
CURSOR ang_cursor IS
SELECT id_angajat, nume, salariu FROM angajati
WHERE id_departament =30;
v_nume angajati.nume%TYPE;
v_sal angajati.salariu%TYPE;
BEGIN
OPEN ang_cursor;
LOOP
FETCH ang_cursor INTO v_nume, v_sal;
EXIT WHEN ang_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_nume||' '||v_sal);
END LOOP;
END;
c.
DECLARE
CURSOR ang_cursor IS
SELECT id_angajat,nume, salariu FROM angajati
WHERE id_departament =30;
v_ang_id angajati.id_angajat%TYPE;
v_nume angajati.nume%TYPE;
v_sal angajati.salariu%TYPE;
BEGIN
OPEN ang_cursor;
LOOP
FETCH ang_cursor INTO v_ang_id,v_nume, v_sal;
EXIT WHEN ang_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_nume||' '||v_sal);
END LOOP;
END;
a.
Pentru a insera un element nou intr-un tablou imbricat, dimensiunea
acestuia trebuie extinsa cu ajutorul metodei EXTEND.
b.
Pentru adaugarea de linii intr-un tablou indexat, acesta trebuie sa
fie initializat cu ajutorul constructorului.
c.
Pentru a insera un element nou intr-un tablou indexat, acesta
trebuie extins cu metoda EXTEND.
d.
Spre deosebire de tablourile indexate, vectorii nu au o dimensiune maxima.
a.
Executia blocului se incheie cu o eroare, deoarece comanda SELECT
utilizeaza coloana id_job care ulterior nu este folosita.
b
Clauza INTO v_ang a comenzii SELECT poate fi inlocuita cu clauza
INTO v_ang.cod, v_ang.sal, v_ang.job.
c.
Definirea tipului r_ang este permisa in partea de declaratii a
blocului PL/SQL.
d.
Blocul se executa fara erori si afiseaza mesajul 'Angajatul cu
codul 100 are salariul in valoare de 5000'.
b.
DECLARE
v_sal number:=&p_sal;
BEGIN
FOR c IN (SELECT nume, salariu
FROM angajati WHERE salariu < v_sal) LOOP
DBMS_OUTPUT.PUT_LINE('Salariatul '||c.nume|| ' are salariul ' ||c.salariu);
END LOOP;
END;
c.
ACCEPT p_sal PROMPT 'Dati o valoare: '
DECLARE
v_sal number:=&p_sal;
BEGIN
FOR c IN (SELECT nume, salariu
FROM angajati WHERE salariu>=v_sal) LOOP
DBMS_OUTPUT.PUT_LINE('Salariatul '||c.nume|| ' are salariul ' ||c.salariu);
END LOOP;
END;
a.
DECLARE
TYPE tip_job IS TABLE OF joburi.nume_job%TYPE;
TYPE tip_nr IS TABLE OF NUMBER;
t_job tip_job;
t_nr tip_nr;
BEGIN
SELECT nume_job, COUNT(*) BULK COLLECT INTO t_job, t_nr
FROM angajati a, joburi j
WHERE a.id_job = j.id_job
GROUP BY nume_job;
FOR i IN 1..t_job.COUNT-1 LOOP
DBMS_OUTPUT.PUT_LINE ('Pe jobul '||t_job(i) || ' lucreaza ' ||
t_nr(i) || ' angajati');
END LOOP;
DBMS_OUTPUT.PUT_LINE ('Numarul total de angajati este ' || t_nr(t_nr.LAST));
END;
b.
DECLARE
TYPE tip_job IS TABLE OF joburi.nume_job%TYPE;
TYPE tip_nr IS TABLE OF NUMBER;
t_job tip_job;
t_nr tip_nr;
BEGIN
SELECT nume_job, COUNT(*) BULK COLLECT INTO t_job, t_nr
FROM angajati a, joburi j
WHERE a.id_job = j.id_job
GROUP BY GROUPING SETS (nume_job,());
FOR i IN 1..t_job.COUNT-1 LOOP
DBMS_OUTPUT.PUT_LINE ('Pe jobul '||t_job(i)|| ' lucreaza ' ||
t_nr(i) || ' angajati');
END LOOP;
DBMS_OUTPUT.PUT_LINE ('Numarul total de angajati este ' || t_nr(t_nr.LAST));
END;
c.
DECLARE
TYPE tip_job IS TABLE OF joburi.nume_job%TYPE;
TYPE tip_nr IS TABLE OF NUMBER;
t_job tip_job;
t_nr tip_nr;
BEGIN
SELECT nume_job, COUNT(*) BULK COLLECT INTO t_job, t_nr
FROM angajati a, joburi j
WHERE a.id_job = j.id_job
GROUP BY ROLLUP (nume_job, ());
FOR i IN 1..t_job.COUNT-1 LOOP
DBMS_OUTPUT.PUT_LINE ('Pe jobul ' ||t_job(i)|| ' lucreaza ' ||
t_nr(i) || ' angajati');
END LOOP;
DBMS_OUTPUT.PUT_LINE ('Numarul total de angajati este ' || t_nr(t_nr.LAST));
END;
10. Care este varianta corecta prin care se adauga in tabelul angajati un
nou camp numit telefon de tip tablou imbricat, prin care se vor stoca
pentru fiecare salariat numerele sale de telefon, si apoi se insereaza
o linie noua in tabel?
a.
CREATE TYPE lista AS TABLE OF VARCHAR2(20);
ALTER TABLE angajati
ADD (telefon lista) NESTED TABLE telefon STORE AS tabel_tel;
INSERT INTO angajati (id_angajat, telefon)
VALUES(300, lista(0214567897,0214567898,0214567899));
b.
CREATE TYPE lista AS TABLE OF VARCHAR2(20);
ALTER TABLE angajati
ADD telefon lista;
INSERT INTO angajati
VALUES(200,'xxx',4000,40000,lista(0214567898,0214567899));
c.
CREATE TYPE lista AS TABLE OF VARCHAR2(20);
ALTER TABLE angajati
ADD (telefon lista) NESTED TABLE telefon STORE AS tabel_tel;
INSERT INTO angajati(telefon)
VALUES(200,'xxx', 4000, 40000, lista(0214567898,0214567899));
11. Se defineste un trigger prin care nu se permite micsorarea pretului cartilor din tabelul “carti”. Care
din urmatoarele variante este corecta?
a) CREATE TRIGGER trigger_carti
BEFORE UPDATE OF pret ON carti
FOR EACH ROW
WHEN (NEW.pret<OLD.pret)
BEGIN
RAISE_APPLICATION_ERROR(-20003,’pretul cartilor nu poate fi micsorat’);
END;
DECLARE
PROCEDURE p1(val NUMBER)
IS
BEGIN
UPDATE angajati
SET salariu=salariu+val
WHERE cod_departmen=10;
END;
BEGIN
p1(700);
END