
Deux méthodes d’affectations de variables existent en PL/SQL:
- Affectation normale : Pour affecter une valeur à une variable nous utilisons l’opérateur :=
VAR1 := 'Valeur 1';
VAR2 := 1234.56;
VAR3 := SYSDATE;
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
Nous pouvons aussi affecter le résultat d’une fonction à une variable:
VAR4 := UPPER('variable 4');
- INTO : La deuxième méthode d’affectation est utilisation du mot clé INTO dans une requête SQL:
SELECT SYSDATE INTO DATE_JOUR FROM DUAL;
La valeur de la variable DATE_JOUR correspond à la date système.
Nous pouvons affecter plusieurs variable dans la même requête comme ceci:
SELECT SYSDATE, UPPER('test'), SUBSTR('Test', 1, 1) INTO DATE_JOUR, VAR1, VAR2 FROM DUAL;
La valeur de VAR1 est TEST et la valeur de VAR2 et T.
- OUT : Il existe aussi une dernière maniéré d’affecter les variables, c’est l’utilisation des procédures avec un paramètre OUT:
Supposons que nous avons une procédure qui prend une première chaîne de caractère en entré et la convertit en majuscule puis retourne le résultat dans une autre chaîne de caractère
PROCEDURE(CHAINE1 IN VARCHAR2, CHAINE2 OUT VARCHAR2);
Nous pouvons utiliser cette procédure pour l’affectation d’une variable:
VAR1 := 'bonjour';
VAR2 := '';
PROCEDURE(VAR1,VAR2);
La valeur de la variable VAR2 dans notre cas est « BONJOUR ».
Les trois methodes d’affectation, en resume
| Methode | Quand l’utiliser | Syntaxe |
|---|---|---|
:= | Valeur connue dans le code, ou resultat d’une fonction | VAR := 'texte'; |
SELECT ... INTO | La valeur vient de la base de donnees | SELECT COL INTO VAR FROM ...; |
Parametre OUT | La valeur est produite par une procedure appelee | MA_PROC(entree, VAR); |
SELECT INTO : les deux erreurs a connaitre
C’est de loin la methode la plus utilisee, et la plus piegeuse. SELECT INTO exige exactement une ligne — ni zero, ni deux. Sinon le bloc leve une exception.
| Situation | Exception levee | Comment s’en premunir |
|---|---|---|
| La requete ne ramene aucune ligne | NO_DATA_FOUND | Bloc EXCEPTION ou valeur par defaut |
| La requete ramene plusieurs lignes | TOO_MANY_ROWS | Affiner le WHERE, ou utiliser un curseur |
DECLARE
V_NOM EMP.ENAME%TYPE;
V_SAL EMP.SAL%TYPE;
BEGIN
SELECT ENAME, SAL
INTO V_NOM, V_SAL
FROM EMP
WHERE EMPNO = 7839;
DBMS_OUTPUT.PUT_LINE(V_NOM || ' gagne ' || V_SAL);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Aucun employe avec ce matricule');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Plusieurs employes correspondent');
END;
/Declarer ses variables avec %TYPE
Dans l’exemple ci-dessus, V_NOM EMP.ENAME%TYPE signifie « du meme type que la colonne ENAME de la table EMP ». C’est une bonne pratique systematique : si le type de la colonne change en base, le code PL/SQL suit automatiquement, sans recompilation manuelle.
| Declaration | Signification |
|---|---|
V_NOM EMP.ENAME%TYPE; | Meme type qu’une colonne |
V_LIGNE EMP%ROWTYPE; | Une ligne entiere de la table |
V_TOTAL NUMBER := 0; | Type explicite avec valeur initiale |
C_TVA CONSTANT NUMBER := 0.2; | Constante, non modifiable |
DECLARE V_EMP EMP%ROWTYPE; -- toute la ligne d'un coup BEGIN SELECT * INTO V_EMP FROM EMP WHERE EMPNO = 7839; DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME || ' / ' || V_EMP.JOB); END; /
Erreurs frequentes
| Erreur | Cause | Correction |
|---|---|---|
PLS-00201 : identificateur non declare | Variable utilisee sans declaration dans DECLARE | Declarer la variable avant BEGIN |
ORA-01403 / NO_DATA_FOUND | SELECT INTO sans resultat | Gerer l’exception |
ORA-06502 : erreur numerique ou de valeur | Valeur trop grande pour la variable | Elargir le type ou utiliser %TYPE |
Confusion = et := | = compare, := affecte | := pour affecter, = dans les tests |
Suite du cours : tests et boucles, puis la gestion des exceptions.
