Sunteți pe pagina 1din 8

1

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
AND
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?
Executia blocului se incheie cu o eroare, deoarece clauza SET a comenzii UPDATE este utilizata gresit.
Executia blocului se incheie cu o eroare, deoarece comanda COMMIT nu poate fi utilizata intr-un bloc PL/SQL.
Blocul se 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.
Executia blocului se incheie cu o eroare, deoarece metoda ROWCOUNT este utilizata pentru un cursor
nedeclarat.
2. Ce trebuie adaugat la linia 9 pentru ca urmatoarea procedura sa fie corect creata?
1 CREATE OR REPLACE PROCEDURE nr_sal (v_dept NUMBER)
2
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;
DBMS _OUTPUT(v_numar);
PRINT v_numar;
nu mai trebuie adaugat nimic
RETURN v_numar;

3
Se da urmatorul bloc PL/SQL:
DECLARE
TYPE r_ang IS RECORD (
cod angajati.id_angajat%TYPE,
sal angajati.salariu%TYPE,
job angajati.id_job%TYPE);
v_ang r_ang;
BEGIN
SELECT id_angajat, salariu, id_job
INTO
v_ang
FROM angajati
WHERE id_angajat = 100;
DBMS_OUTPUT.PUT_LINE ('Angajatul cu codul '|| v_ang.cod ||
' are salariul in valoare de ' || v_ang.sal);
END;
Stiind ca in tabelul angajati exista angajatul cu codul 100 care are un salariu de 5000, care dintre urmatoarele
afirmatii nu este adevarata?
Executia blocului se incheie cu o eroare, deoarece comanda SELECT utilizeaza coloana id_job care ulterior
nu este folosita.
Clauza INTO v_ang a comenzii SELECT poate fi inlocuita cu clauza INTO v_ang.cod, v_ang.sal, v_ang.job.
Definirea tipului r_ang este permisa in partea de declaratii a blocului PL/SQL.
Blocul se executa fara erori si afiseaza mesajul 'Angajatul cu codul 100 are salariul in valoare de 5000'.
4
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;
TYPE SEM=i
VARIABLE sem=II
ACCEPT sem
ACCEPT sem SET 'sem= '

5
Care dintre urmatoarele afirmatii este corecta?
Atunci cand un tabel este sters, triggeri asociati acestuia sunt eliminati.
Corpul unui trigger nu poate contine comenzi LMD.
Blocul PL/SQL care descrie actiunea unui trigger poate contine comanda COMMIT.
In clauza ON din definitia unui trigger pot fi specificate mai multe tabele sau vizualizari
6
Se da urmatorul bloc PL/SQL:
DECLARE
v_numar NUMBER;
v_boolean BOOLEAN;
BEGIN
v_numar := 25;
v_boolean := NOT(v_numar > 30);
END;
Care dintre urmatoarele afirmatii este adevarata?
Executia blocului se incheie cu o eroare, deoarece variabila v_boolean nu este initializata la declarare.
In urma executiei blocului variabila v_boolean va avea valoarea true.
In urma executiei blocului variabila v_boolean va avea valoarea false.
Executia blocului se incheie cu o eroare, deoarece pentru variabila v_numar nu este specificata dimensiunea
maxima.
7
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?
CREATE OR REPLACE PACKAGE check_ang_pkg IS
g_max_length_of_service NUMBER;
PROCEDURE check_data_angajarii
(p_date IN angajati.data_angajarii%TYPE);
END check_ang_pkg;
CREATE OR REPLACE PACKAGE BODY check_ang_pkg IS
PROCEDURE check_data_angajarii
(p_date IN angajati.data_angajarii%TYPE) IS
BEGIN
IF MONTHS_BETWEEN(SYSDATE, p_date) >
g_max_length_of_service THEN
RAISE_APPLICATION_ERROR(-20202, 'Varsta de pensionare');
END IF;

END check_ang_pkg;
CREATE OR REPLACE PACKAGE check_ang_pkg IS
g_max_length_of_service CONSTANT NUMBER := 600;
PROCEDURE check_data_angajarii
(p_date OUT angajati.data_angajarii%TYPE);
END check_ang_pkg;
CREATE OR REPLACE PACKAGE check_ang_pkg IS
PROCEDURE check_data_angajarii
(p_date IN angajati.data_angajarii%TYPE) IS
BEGIN
IF MONTHS_BETWEEN(SYSDATE, p_date) >
g_max_length_of_service THEN
RAISE_APPLICATION_ERROR(-20202, 'Varsta de pensionare');
END IF;
END check_data_angajarii;
CREATE OR REPLACE PACKAGE check_ang_pkg IS
g_max_length_of_service CONSTANT NUMBER := 600;
PROCEDURE check_data_angajarii
(p_date IN angajati.data_angajarii%TYPE);
END check_ang_pkg;
CREATE OR REPLACE PACKAGE BODY check_ang_pkg IS
PROCEDURE check_data_angajarii
(p_date IN angajati.data_angajarii%TYPE) IS
BEGIN
IF MONTHS_BETWEEN(SYSDATE, p_date) >
g_max_length_of_service THEN
RAISE_APPLICATION_ERROR(-20202, 'Varsta de pensionare');
END IF;
END check_data_angajarii;
END check_ang_pkg;
8. Se da urmatorul corp de pachet, care contine doua proceduri overload denumite add_dept.
CREATE OR REPLACE PACKAGE BODY dept_pkg IS
PROCEDURE add_dept(p_dept NUMBER, p_nume VARCHAR2:='unknown') IS --1
BEGIN
INSERT INTO departamente(id_departament, nume_departament)
VALUES (p_dept, p_nume);
END add_dept;
PROCEDURE add_dept (p_nume VARCHAR2:='unknown') IS --2
BEGIN
INSERT INTO departamente (id_departament, nume_departament)
VALUES (departamente_seq.NEXTVAL, p_nume);
END add_dept;
END dept_pkg;
Care varianta este corecta pentru a executa procedura 2?
BEGIN
dept_pkg.add_dept('Training');
END;

BEGIN
dept_pkg.add_dept( 100,'Training');
END;
eroare, nu apeleza nici o procedura
BEGIN
dept_pkg.add_dept ('Training',100);
END;
9. 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;
Ce se va afisa la executia blocului de mai sus?
Tabloul are 10 elemente
Tabloul are 10 elemente
Tabloul are 0 elemente
Nu afiseaza nimic
Tabloul are 10 elemente
Tabloul are 0 elemente
Tabloul are 0 elemente
EROARE
10 Care este varianta corecta pentru crearea unui cursor explicit care sa afiseze, ID-ul, numele si salariul
angajatilor care lucreaza in departamentul 30?
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;
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;
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;

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