🎯 Certification Oracle SQL 1Z0-071 : entraînez-vous avec nos examens blancs corrigés en françaisExamens blancs 1Z0-071Voir sur Udemy →

Cours SQL ORACLE – 07-02 : Affectations

Illustration du tutoriel SQL Oracle : Cours SQL ORACLE – 07-02 : Affectations

Deux méthodes d’affectations de variables existent en PL/SQL:

Publicité
  • 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

MethodeQuand l’utiliserSyntaxe
:=Valeur connue dans le code, ou resultat d’une fonctionVAR := 'texte';
SELECT ... INTOLa valeur vient de la base de donneesSELECT COL INTO VAR FROM ...;
Parametre OUTLa valeur est produite par une procedure appeleeMA_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.

SituationException leveeComment s’en premunir
La requete ne ramene aucune ligneNO_DATA_FOUNDBloc EXCEPTION ou valeur par defaut
La requete ramene plusieurs lignesTOO_MANY_ROWSAffiner 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.

DeclarationSignification
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

ErreurCauseCorrection
PLS-00201 : identificateur non declareVariable utilisee sans declaration dans DECLAREDeclarer la variable avant BEGIN
ORA-01403 / NO_DATA_FOUNDSELECT INTO sans resultatGerer l’exception
ORA-06502 : erreur numerique ou de valeurValeur trop grande pour la variableElargir 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.

Sur le même thème

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *