Documente Academic
Documente Profesional
Documente Cultură
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;