Intrebari Primite 18
Intrebari Primite 18
Intrebari Primite 18
2. 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 INDEX BY BINARY_INTEGER;
3 tablou typetablou;
4 BEGIN
5 FOR i IN 1..10 LOOP
6
7 tablou(i) := i;
8 END LOOP;
9 END;
a. tablou:= typetablou();
b. tablou.EXTEND;
c. nimic corect era c – din calculele lui eddytion
d. tablou(i).NEXT;
3. Care este varianta de bloc PL/SQL corecta pentru a mentine intr-un vector codurile
angajatilor care au salariul mai mic decat 20000 si nu lucreaza in departamentul 80 sau 90?
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_departament=90 AND salariu < 20000;
END;
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_departament NOT IN (80, 90) AND salariu < 20000;
END;
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;
? 4. Care este varianta corecta prin care se afiseaza numarul total de angajati, respectiv
numarul de angajati pentru fiecare job?
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;
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;
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;
Am dat acest raspuns dar cred ca este gresit
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?
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'.
a.
BEGIN
FOR d IN (SELECT nume_departament FROM departamente) LOOP
DBMS_OUTPUT.PUT_LINE('Departamentul ' || d.nume_departament);
FOR a IN (SELECT nume FROM angajati) LOOP
DBMS_OUTPUT.PUT_LINE('Angajatul ' || a.nume);
END LOOP;
END LOOP;
END;
b.
BEGIN
FOR d IN (SELECT nume_departament, nume
FROM departamente d, angajati a
WHERE d.id_departament = a.id_departament) LOOP
DBMS_OUTPUT.PUT_LINE('Departamentul ' || d.nume_departament);
DBMS_OUTPUT.PUT_LINE('Angajatul ' || d.nume);
END LOOP;
END;
c.
BEGIN
FOR d IN (SELECT nume_departament, id_departament FROM departamente) LOOP
DBMS_OUTPUT.PUT_LINE('Departamentul ' || d.nume_departament);
FOR a IN (SELECT nume FROM angajati
WHERE id_departament=d.id_departament) LOOP
DBMS_OUTPUT.PUT_LINE('Angajatul ' || a.nume);
END LOOP;
END LOOP;
END;
Nici aici nu cred ca este bine
?9. Se da urmatorul corp de pachet, care contine doua proceduri overload denumite add_dept.
b.
BEGIN
dept_pkg.add_dept( 100,'Training');
END;
c.
eroare, nu apeleza nici o procedura
d.
BEGIN
dept_pkg.add_dept ('Training',100);
END;
c.
VARIABLE v_mesaj VARCHAR2(50)
BEGIN
:v_mesaj := ' Invat PL/SQL ';
DBMS_OUTPUT.PUT_LINE(:v_mesaj);
END;
/
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;
Care dintre urmatoarele variante apeleaza corect functia F_TEST care are un singur
parametru de tip numeric?
DECLARE
nr NUMBER(4);
BEGIN
nr := F_TEST (80);
END;
VARIABLE nr NUMBER
CALL F_TEST () INTO :nr;
PRINT nr
VARIABLE nr NUMBER
CALL FUNCTION F_TEST (80) INTO :nr;
PRINT nr
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?
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.
Care este varianta corecta de creare a unui pachet prin care se defineste o variabila globala si o
procedura ce permite actualizarea acesteia?
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?
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;
Care este varianta corecta pentru a folosi un ciclu cursor cu subcereri care sa afiseze numele si salariul
salariatilor care au salariul mai mic decat o valoare introdusa de la tastatura?
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;
Care dintre urmatoarele variante apeleaza corect functia F_TEST care are un singur parametru de tip
numeric?
SELECT F_TEST (80)
FROM DUAL ;
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.
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;
b. Dupa ce este definit, triggerul devine activ si va fi executat ori de cate ori au loc operatiile
declansatoare asociate acestuia.
Care este varianta corecta prin care se incarca date dintr-un cursor intr-o colectie?
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;;
BEGIN
SELECT nume_job
INTO :rezultat
FROM angajati a, joburi b
WHERE a.id_job=b.id_job
AND id_angajat=100;
DBMS_OUTPUT.PUT_LINE('Numele jobului este '|| :rezultat);
END;
Care dintre urmatoarele afirmatii este adevarata?