L5 Ex1
Ecrivez un bloc PL / SQL qui efface les étudiants de la spécialisation avec le code 21 (DELETE). Après DELETE les valeurs de ROWCOUNT, FOUND, et NOTFOUND sont affichées. Après avoir affiché, la commande DELETE est annulée avec ROLLBACK.
-- EX1
BEGIN
DELETE FROM STUD1
WHERE CODS = 21;
dbms_output.put_line('On a modifie '|| SQL%ROWCOUNT || ' lignes');
IF sql%found THEN
dbms_output.put_line('Found TRUE');
ELSE
dbms_output.put_line('Found FALSE');
END IF;
IF sql%notfound THEN
dbms_output.put_line('NOTFound TRUE');
ELSE
dbms_output.put_line('NOTFound FALSE');
END IF;
ROLLBACK;
END;
L5 Ex 2
Ajouter l’affichage de la valeur d’ISOPEN. Les valeurs possibles: NULL, FALSE, TRUE ou exception.
-- EX2
BEGIN
UPDATE FROM STUD1
WHERE CODS = 21;
IF sql%isopen THEN
dbms_output.put_line('Open TRUE');
ELSE
dbms_output.put_line('Open FALSE');
END IF;
ROLLBACK;
END;
Update punctaj studenti
DECLARE total_rows number(2);
TYPE t_stud IS TABLE OF stud % ROWTYPE INDEX BY PLS_INTEGER;
v_stud t_stud;
BEGIN
UPDATE
stud
SET
punctaj = punctaj + 1000;
IF sql % notfound THEN dbms_output.put_line('no stud selected');
ELSIF sql % found THEN total_rows := sql % rowcount;
dbms_output.put_line(
total_rows || ' customers selected '
);
END IF;
SELECT
BULK COLLECT INTO v_stud
FROM
STUD
WHERE
punctaj is not null;
dbms_output.put_line(
'COUNT studenti: ' || v_stud.count
);
FOR i IN v_stud.first..v_stud.last loop DBMS_OUTPUT.PUT_LINE(
i || ' nume: ' || v_stud(i).nume || ' punctaj:' || v_stud(i).punctaj
);
END LOOP;
ROLLBACK;
END;
12 customers selected
COUNT studenti: 12
1 nume: GEORGE punctaj:3890
2 nume: VASILE punctaj:1390
3 nume: MARIA punctaj:2400
4 nume: ION punctaj:2670
5 nume: STANCA punctaj:1620
6 nume: ALEX punctaj:2570
7 nume: ELENA punctaj:1890
8 nume: ADRIAN punctaj:1450
9 nume: FLOREA punctaj:4230
10 nume: OANA punctaj:1760
11 nume: MARIUS punctaj:1310
12 nume: VOICU punctaj:2290
Custom / Explicit Cursor
DECLARE TYPE t_stud IS TABLE OF stud % ROWTYPE INDEX BY PLS_INTEGER;
v_stud t_stud;
c_name stud.nume % type;
c_punct stud.punctaj % type;
CURSOR c_stud is
SELECT
nume,
punctaj
FROM
stud;
BEGIN OPEN c_stud;
LOOP FETCH c_stud into c_name,
c_punct;
EXIT WHEN c_stud % notfound;
dbms_output.put_line(c_name || ' ' || c_punct);
END LOOP;
CLOSE c_stud;
END;
GEORGE 2890
VASILE 390
MARIA 1400
ION 1670
STANCA 620
ALEX 1570
ELENA 890
ADRIAN 450
FLOREA 3230
OANA 760
MARIUS 310
VOICU 1290
L5 Ex 3
Comme 2, mais au lieu de DELETE on ajoute de nouveau les étudiants de la spécialisation 21 par INSERT de SELECT.
L5 Ex 4
Ecrivez un bloc PL / SQL qui utilise un curseur implicite et une boucle FOR pour les curseurs (les diapositives 35-36 du cours) pour afficher le nom et le numéro de points pour les étudiants de la spécialisation avec le code 21.
-- ex4
BEGIN
FOR v_stud IN (select nume, punctaj from STUD1 where cods=21) LOOP
dbms_output.put_line('Etudiant: ' || v_stud.nume || ' puncte: ' || v_stud.punctaj);
END LOOP;
END;
L5 Ex 5
Ecrivez un bloc PL / SQL qui utilise un curseur explicite et une boucle LOOP – EXIT WHEN pour afficher le nom et la date de naissance pour les étudiants de la spécialisation avec le code 21. Ils sont numérotés en utilisant ROWCOUNT. Les deux valeurs sont stockées en deux variables.
--EX5
DECLARE
CURSOR studenti IS SELECT * FROM STUD1 WHERE CODS =21;
v_stud studenti%rowtype;
BEGIN
OPEN studenti;
LOOP
FETCH studenti INTO v_stud;
EXIT WHEN studenti%notfound;
dbms_output.put_line(studenti%rowcount || 'Etudiant: ' || v_stud.nume || ', avec la date de nasissance: ' || v_stud.datan);
END LOOP;
CLOSE studenti;
END;
1Etudiant: ION, avec la date de nasissance: 24-JAN-85
2Etudiant: STANCA, avec la date de nasissance: 15-MAY-82
3Etudiant: ALEX, avec la date de nasissance: 07-NOV-81
4Etudiant: ELENA, avec la date de nasissance: 29-AUG-84
L5 Ex 6
Comme 5, mais on utilise une variable enregistrement pour FETCH. (Sauvegardez le bloc pour l’exercice 13).
--ex6
BEGIN
OPEN studenti;
FETCH studenti INTO v_stud;
WHILE studenti%found LOOP
dbms_output.put_line(studenti%rowcount|| ' Etudiant: ' || v_stud.nume||' score '||v_stud.punctaj);
FETCH studenti INTO v_stud;
END LOOP;
L5 Ex 7 Comme 6 mais utilisez une boucle WHILE
--EX7
DECLARE
CURSOR studenti IS SELECT * FROM STUD1 WHERE CODS=21;
v_stud studenti%rowtype;
n number;
i number;
BEGIN
SELECT COUNT(*) INTO n FROM STUD1 WHERE CODS=21;
dbms output.put_line('NrStud='||n);
OPEN studenti;
FOR i IN 1..n LOOP
FETCH studenti INTO v_stud;
dbms_output.put_line(studenti%rowcount|| ' Etudiant: ' || v_stud.nume||' score '||v_stud.punctaj)
END LOOP;
CLOSE studenti;
END;
L5 Ex 8
Comme 7 mais utilisez une boucle FOR classique (pas FOR pour les curseurs).
DECLARE
CURSOR studenti IS SELECT * FROM STUD WHERE CODS = 11;
BEGIN
FOR v_stud IN studenti LOOP
dbms_output.put_line(studenti%rowcount || ' Etudiant: ' || v_stud.nume
|| ', avec la date de naissance: ' || v_stud.datan);
END LOOP;
END;
L5 Ex 9
Comme 8, mais utilisez une boucle FOR pour les curseurs.
--ex9
DECLARE
CURSOR studenti IS SELECT * FROM STUD1 WHERE CODS=21;
BEGIN
FOR v_stud IN studenti LOOP
dbms_output.put_line(studenti%rowcount|| ' Etudiant: ' || v_stud.nume||' avec la date de naissance '||v_stud.datan);
END LOOP;
END;
L5 Ex 10
Comme 9 mais le curseur a un paramètre – le code de spécialisation – qui est dans une constante. La valeur par défaut est 11.
L5 Ex 11
Comme 10, mais le curseur a deux paramètres – le code de spécialisation et l’année d’étude. Les valeurs par défaut sont 11 et 1.
L5 Ex 12
Comme 11, mais l’appel est effectué avec le premier paramètre de default et le deuxième paramètre égale à une constante.
L5 Ex 13
Comme 6 mais utilisez une variable de type REF_CURSOR pour définir le curseur.
L5 Toate EX
-- EX1
-- BEGIN
-- DELETE FROM STUD1
-- WHERE CODS = 21;
-- dbms_output.put_line('On a modifie '|| SQL%ROWCOUNT || ' lignes');
-- IF sql%found THEN
-- dbms_output.put_line('Found TRUE');
-- ELSE
-- dbms_output.put_line('Found FALSE');
-- END IF;
-- IF sql%notfound THEN
-- dbms_output.put_line('NOTFound TRUE');
-- ELSE
-- dbms_output.put_line('NOTFound FALSE');
-- END IF;
-- ROLLBACK;
-- END;
-- EX2
-- BEGIN
-- UPDATE FROM STUD1
-- WHERE CODS = 21;
-- IF sql%isopen THEN
-- dbms_output.put_line('Open TRUE');
-- ELSE
-- dbms_output.put_line('Open FALSE');
-- END IF;
-- ROLLBACK;
-- END;
-- ex4
-- BEGIN
-- FOR v_stud IN (select nume, punctaj from STUD1 where cods=21) LOOP
-- dbms_output.put_line('Etudiant: ' || v_stud.nume || 'puncte: ' || v_stud.punctaj);
-- END LOOP;
-- END;
--EX5
-- DECLARE
-- CURSOR studenti IS SELECT * FROM STUD1 WHERE CODS =21;
-- v_stud studenti%rowtype;
-- BEGIN
-- OPEN studenti;
-- LOOP
-- FETCH studenti INTO v_stud;
-- EXIT WHEN studenti%notfound;
-- dbms_output.put_line(studenti%rowcount || 'Etudiant: ' || v_stud.nume || ', avec la date de nasissance: ' || v_stud.datan);
-- END LOOP;
-- CLOSE studenti;
-- END;
--ex6
-- BEGIN
-- OPEN studenti;
-- FETCH studenti INTO v_stud;
-- WHILE studenti%found LOOP
-- dbms_output.put_line(studenti%rowcount|| ' Etudiant: ' || v_stud.nume||' score '||v_stud.punctaj);
-- FETCH studenti INTO v_stud;
-- END LOOP;
--EX7
DECLARE
CURSOR studenti IS SELECT * FROM STUD1 WHERE CODS=21;
v_stud studenti%rowtype;
n number;
i number;
BEGIN
SELECT COUNT(*) INTO n FROM STUD1 WHERE CODS=21;
dbms output.put_line('NrStud='||n);
OPEN studenti;
FOR i IN 1..n LOOP
FETCH studenti INTO v_stud;
dbms_output.put_line(studenti%rowcount|| ' Etudiant: ' || v_stud.nume||' score '||v_stud.punctaj)
END LOOP;
CLOSE studenti;
END;
--ex9
DECLARE
CURSOR studenti IS SELECT * FROM STUD1 WHERE CODS=21;
BEGIN
FOR v_stud IN studenti LOOP
dbms_output.put_line(studenti%rowcount|| ' Etudiant: ' || v_stud.nume||' avec la date de naissance '||v_stud.datan);
END LOOP;
END;