L3 ex1
1. Ecrire un bloc PL / SQL qui contient une constante avec un code d’étudiant (MATR) et affiche le nombre de ses disciples:
0 – aucun disciple
1-1 disciple
> 1 – plus de disciples
en utilisant la requête suivante et les exceptions NO_DATA_FOUND et TOO_MANY_ROWS:
SELECT NUME INTO V_NOM FROM STUD WHERE TUTOR = codeetudiant -- constante
DECLARE
codeetudiant constant number(4) :=1200;
-- codeetudiant constant number(4) :=1456;
-- codeetudiant constant number(4) :=4311;
v_nom stud.nume%type;
BEGIN
SELECT NUME INTO v_nom FROM STUD WHERE TUTOR = codeetudiant;
DBMS_OUTPUT.PUT_LINE('UNUL');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('ZERO');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('MULTI');
END;
DECLARE TYPE t_stud IS TABLE OF stud.nume % type INDEX BY PLS_INTEGER;
v_stud t_stud;
-- codeetudiant constant number(4) :=1200;
-- codeetudiant constant number(4) :=1456;
codeetudiant constant number(4) := 4311;
v_nom stud.nume % type;
BEGIN -- varianta care genereaza exceptie
-- SELECT NUME INTO v_nom FROM STUD WHERE TUTOR = codeetudiant;
-- DBMS_OUTPUT.PUT_LINE('UNUL');
-- varianta care preia mai multe valori intr-o variabila SELECT NUME BULK COLLECT INTO v_stud FROM STUD WHERE TUTOR = codeetudiant; dbms_output.put_line('COUNT: ' || v_stud.count);
EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('ZERO');
WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('MULTI');
END;
DECLARE TYPE t_stud IS TABLE OF stud.nume % type INDEX BY PLS_INTEGER;
v_stud t_stud;
-- codeetudiant constant number(4) :=1200;
-- codeetudiant constant number(4) :=1456;
codeetudiant constant number(4) := 4311;
v_nom stud.nume % type;
BEGIN
-- varianta care preia mai multe valori intr-o variabila
SELECT
NUME BULK COLLECT INTO v_stud
FROM
STUD
WHERE
TUTOR = codeetudiant;
dbms_output.put_line('COUNT studenti tutorelui: ' || v_stud.count);
FOR i IN v_stud.first..v_stud.last loop
DBMS_OUTPUT.PUT_LINE(i || ' ' || v_stud(i));
END LOOP;
END;
%RowType luam toata linia, nu numai numele
DECLARE TYPE t_stud IS TABLE OF stud % ROWTYPE INDEX BY PLS_INTEGER;
v_stud t_stud;
-- codeetudiant constant number(4) :=1200;
-- codeetudiant constant number(4) :=1456;
codeetudiant constant number(4) := 4311;
BEGIN
-- varianta care preia mai multe valori intr-o variabila
SELECT * BULK COLLECT INTO v_stud FROM STUD
WHERE TUTOR = codeetudiant;
dbms_output.put_line(
'COUNT studenti tutorelui: ' || v_stud.count
);
FOR i IN v_stud.first..v_stud.last loop
DBMS_OUTPUT.PUT_LINE(i || ' nume: ' || v_stud(i).nume || ' anul:' || v_stud(i).an || ' punctaj:' || v_stud(i).punctaj);
END LOOP;
END;
L3 ex2
Le même exercice mais en utilisant les codes d’erreur numériques et WHEN OTHERS avec IF THEN ELSIF ELSE
Les codes sont:
NO_DATA_FOUND code +100 (SQL: -1403) TOO_MANY_ROWS code -1422
DECLARE
codeetudiant constant number(4) :=1200;
-- codeetudiant constant number(4) :=1456;
-- codeetudiant constant number(4) :=4311;
v_nom stud.nume%type;
BEGIN
SELECT NUME INTO v_nom FROM STUD WHERE TUTOR = codeetudiant;
DBMS_OUTPUT.PUT_LINE('UNUL');
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = 100 THEN
DBMS_OUTPUT.PUT_LINE('ZERO');
DBMS_OUTPUT.PUT_LINE(SQLCODE);
ELSIF SQLCODE = -1422 THEN
DBMS_OUTPUT.PUT_LINE('MULTI');
DBMS_OUTPUT.PUT_LINE(SQLCODE);
END IF;
END;
L3 ex3
Le même exercice mais en utilisant les codes d’erreur numériques et WHEN OTHERS avec CASE
Les codes sont:
NO_DATA_FOUND code +100 (SQL: -1403) TOO_MANY_ROWS code -1422
DECLARE
codeetudiant constant number(4) :=1200;
-- codeetudiant constant number(4) :=1456;
-- codeetudiant constant number(4) :=4311;
v_nom stud.nume%type;
code number;
BEGIN
SELECT NUME INTO v_nom FROM STUD WHERE TUTOR = codeetudiant;
DBMS_OUTPUT.PUT_LINE('UNUL');
EXCEPTION
WHEN OTHERS THEN
code := SQLCODE;
CASE code
WHEN 100 THEN DBMS_OUTPUT.PUT_LINE('ZERO');
WHEN -1422 THEN DBMS_OUTPUT.PUT_LINE('MULTI');
END CASE;
END;
L3 ex4
Ecrire un bloc PL / SQL qui contient une constante avec un code d’étudiant (MATR) et affiche le nombre de ses disciples:
0 – aucun disciple
1-1 disciple
> 1 – plus de disciples
en utilisant la requête suivante:
SELECT COUNT(*)
INTO V_NR
FROM STUD
WHERE TUTOR = codeetudiant — constante
et trois exception definites par l’utilisateur: E0, E1 et EM (on peut utiliser IF ou CASE)
DECLARE
-- codeetudiant constant number(4) :=1200;
-- codeetudiant constant number(4) :=1456;
codeetudiant constant number(4) :=4311;
v_nom stud.nume%type;
code number;
V_NR number;
E0 EXCEPTION;
E1 EXCEPTION;
E2 EXCEPTION;
BEGIN
SELECT COUNT(*)
INTO V_NR
FROM STUD
WHERE TUTOR = codeetudiant; -- constante
IF (V_NR = 0) THEN
RAISE E0;
ELSIF (V_NR = 1) THEN
RAISE E1;
ELSE
RAISE E2;
END IF;
EXCEPTION
WHEN E0 THEN
DBMS_OUTPUT.PUT_LINE('0');
WHEN E1 THEN
DBMS_OUTPUT.PUT_LINE('1');
WHEN E2 THEN
DBMS_OUTPUT.PUT_LINE('>1');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Autre exception');
END;
L3 ex5
Le même exercice (comme 4) mais en utilisant RAISE_APPLICATION_ERROR
Sans des noms pour les exceptions (seulement des codes entre -20000 et – 20999)
Avec des noms pour les exceptions: E0, E1 et EM
DECLARE
-- codeetudiant constant number(4) :=1200;
codeetudiant constant number(4) :=1456;
-- codeetudiant constant number(4) :=4311;
v_nom stud.nume%type;
code number;
V_NR number;
E0 EXCEPTION;
PRAGMA EXCEPTION_INIT(E0, -20000);
E1 EXCEPTION;
PRAGMA EXCEPTION_INIT(E1, -20001);
E2 EXCEPTION;
PRAGMA EXCEPTION_INIT(E2, -20002);
BEGIN
SELECT COUNT(*)
INTO V_NR
FROM STUD
WHERE TUTOR = codeetudiant; -- constante
IF (V_NR = 0) THEN
RAISE_APPLICATION_ERROR(-20000, '0');
ELSIF (V_NR = 1) THEN
RAISE_APPLICATION_ERROR(-20001, '1');
ELSE
RAISE_APPLICATION_ERROR(-20002, '>1');
END IF;
EXCEPTION
WHEN E0 THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
WHEN E1 THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
WHEN E2 THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Autre exception');
END;
L3 ex6
Ecrire un bloc PL / SQL qui contient la declaration suivante:
sal_min CONSTANT NUMBER(3) := 1200;
Et le traitement pour elle
BEGIN
DECLARE
sal_min CONSTANT NUMBER(3) := 1200;
BEGIN
DBMS_OUTPUT.PUT_LINE('INSTR SUBBLOC');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('TRATARE ERORI SUBBLOC');
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('TRATARE ERORI BLOC');
END;
Ex 7
Ecrire un bloc PL / SQL qui contient la déclaration suivante:
sal_min NUMBER(3);
Et l’instruction (après BEGIN):
sal_min := 1200;
Et le traitement pour elle
Ex 8
Le même exercice (comme 7) mais l’exception se propage vers un bloc qui entoure le bloc contenant l’exception.