Affectation par une requête SELECT INTO
Syntaxe :
A condition que la requête ne renvoie qu'un tuple et qu'elle projette autant de propriétés de ce tuple que de variables référencées dans la clause INTO.
Exemple :
CTRL+C pour copier, CTRL+V pour coller
1
DECLARE
2
v_deptno dept.deptno%TYPE;
3
v_loc dept.loc%TYPE;
4
BEGIN
5
SELECT deptno, loc
6
INTO v_deptno, v_loc
7
FROM dept
8
WHERE dname = 'SALES';
9
...
10
END;
DECLARE v_deptno dept.deptno%TYPE; v_loc dept.loc%TYPE; BEGIN SELECT deptno, loc INTO v_deptno, v_loc FROM dept WHERE dname = 'SALES'; ... END;
Remarque : Syntaxe %TYPE
Cette syntaxe est largement recommandée pour l'affectation depuis une requête.
Remarque : Affectation d'une variable RECORD
Il est possible avec la clause INTO d'affecter des résultats de requête à plusieurs colonnes dans une variable RECORD.
Rappel : BD "Gestion des intervenants" : Schéma relationnel
CTRL+C pour copier, CTRL+V pour coller
1
tIntervenant (#pknom:varchar, prenom:varchar, poste:integer)
2
tCours (#pkannee:2000..2100, #pknum:integer, titre:varchar, type:C|TD|TP, fkintervenant=>tIntervenant, debut:date)
tIntervenant (#pknom:varchar, prenom:varchar, poste:integer) tCours (#pkannee:2000..2100, #pknum:integer, titre:varchar, type:C|TD|TP, fkintervenant=>tIntervenant, debut:date)
Exemple : BD "Gestion des intervenants" : Fonction et affectation par une requête
CTRL+C pour copier, CTRL+V pour coller
1
CREATE OR REPLACE FUNCTION fIntervient (pIntervenant VARCHAR2)
2
RETURN VARCHAR2
3
IS
4
vNbInterventions NUMBER;
5
BEGIN
6
SELECT COUNT(fkintervenant) INTO vNbInterventions
7
FROM tCours
8
WHERE fkintervenant=pIntervenant;
9
10
IF vNbInterventions > 0 THEN
11
RETURN 'OUI';
12
ELSE
13
RETURN 'NON';
14
END IF;
15
END;
16
/
17
18
SELECT pknom, fIntervient(pknom) AS I FROM tIntervenant;
CREATE OR REPLACE FUNCTION fIntervient (pIntervenant VARCHAR2) RETURN VARCHAR2 IS vNbInterventions NUMBER; BEGIN SELECT COUNT(fkintervenant) INTO vNbInterventions FROM tCours WHERE fkintervenant=pIntervenant; IF vNbInterventions > 0 THEN RETURN 'OUI'; ELSE RETURN 'NON'; END IF; END; / SELECT pknom, fIntervient(pknom) AS I FROM tIntervenant;