Raspunsuri Corecte 100 in 100

9

Click here to load reader

description

Raspunsuri Baza date sem 2

Transcript of Raspunsuri Corecte 100 in 100

1

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;