Intrebari Primite 18

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 10

1.

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;

 a.   DBMS _OUTPUT(v_numar); 


 b. PRINT v_numar; 
 c. nu mai trebuie adaugat nimic 
 d. RETURN v_numar; 

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

5. 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?
  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'. 

? 6. Care este varianta corecta pentru declararea urmatoarelor variabile?

    c_valoare        CONSTANT NUMBER;


a. v_cod_dep      departamente.id_departament%TYPE;
v_dep              departamente%ROWTYPE :=10,'Vanzari',101,'Bucuresti'; 

  c_valoare        CONSTANT NUMBER := 1000;


b. v_cod_dep      departamente%TYPE;
v_ang              angajati%ROWTYPE; 

  c_valoare        CONSTANT NUMBER := 1000;


c. v_cod_dep      departamente.id_departament%TYPE; 
v_dep              departamente%ROWTYPE; 
? 7. Care este varianta corecta prin care se obtine pentru fiecare departament lista 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
      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

? 8. Care dintre urmatoarele afirmatii  este corecta?

   a. Un trigger nu poate fi redenumit utilizand o comanda ALTER TRIGGER. 


  b. Dupa ce este definit, triggerul  devine activ si va fi executat ori de cate ori au loc operatiile
declansatoare asociate acestuia. 
  c. Un trigger nu poate fi recompilat utilizand o comanda ALTER TRIGGER. 
  d. Un trigger la nivel de linie este executat o singura data, indiferent de numarul de linii afectate de
comanda declansatoare. 

?9. 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?


 a.
  BEGIN
  dept_pkg.add_dept('Training');
END; 

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; 

10. Care este varianta corecta pentru afisarea variabilei v_mesaj?


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;

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?

SELECT F_TEST (80)


FROM DUALBD;

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

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?

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.


Blocul se executa fara erori si afiseaza mesajul 'Angajatul cu codul 100 are salariul in valoare de
5000'.

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 din urmatoarele afirmatii este adevarata?'


aPentru a insera un element nou intr-un tablou imbricat, dimensiunea
acestuia trebuie extinsa cu ajutorul metodei EXTEND.

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 ;

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.

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;

ACCEPT sem PROMPT ‘sem=’

Care dintre urmatoarele afirmatii este corecta?

Un trigger nu poate fi redenumit utilizand o comanda ALTER TRIGGER.


Dupa ce este definit, triggerul devine activ si va fi executat ori de cate ori au loc operatiile
declansatoare asociate acestuia.
Un trigger nu poate fi recompilat utilizand o comanda ALTER TRIGGER.
Un trigger la nivel de linie este executat o singura data, indiferent de numarul de linii afectate de
comanda declansatoare.

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;;

Se da urmatorul bloc PL/SQL:

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?

Executia blocului se incheie cu o eroare, deoarece variabila de


legatura rezultat nu este declarata în afara blocului PL/SQL

You might also like