Déclarer et affecter des valeurs à des variables et à des constantes

Une variable ou constante déclarée dans une spécification de package est disponible pour tout programme ayant accès au package. Une variable ou une constante déclarée dans un corps ou un sous-programme de package est locale à ce package ou sous-programme. Lors de la déclaration d'une constante, vous devez lui affecter une valeur initiale.

Un avantage significatif du langage PL/SQL par rapport au langage SQL est que le langage PL/SQL permet de déclarer et d'utiliser des variables et des constantes.

Une variable ou constante déclarée dans une spécification de package est disponible pour tout programme ayant accès au package. Une variable ou une constante déclarée dans un corps ou un sous-programme de package est locale à ce package ou sous-programme.

Une variable contient une valeur d'un type de données particulier. Votre programme peut modifier la valeur au moment de l'exécution. Une valeur constante contient une valeur qui ne peut pas être modifiée.

Une variable ou une constante peut avoir n'importe quel type de données PL/SQL. Lorsque vous déclarez une variable, vous pouvez lui affecter une valeur initiale. Si ce n'est pas le cas, sa valeur initiale est NULL. Lors de la déclaration d'une constante, vous devez lui affecter une valeur initiale. Pour affecter une valeur initiale à une variable ou à une constante, utilisez l'opérateur d'affectation (:=).

Conseil : Déclarez toutes les valeurs qui ne changent pas en tant que constantes. Cet exercice optimise votre code compilé et facilite la maintenance de votre code source.

Voir aussi : Informations de référence sur le langage PL/SQL pour Oracle Database pour des informations générales sur les variables et les constantes

Tutoriel : Déclarer des variables et des constantes dans un sous-programme

Ce tutoriel explique comment utiliser l'outil Edit de SQL Developer pour déclarer des variables et des constantes dans la fonction EMP_EVAL.CALCULATE_SCORE. (Ce tutoriel est également un exemple de modification du corps d'un package.)

La fonction EMP_EVAL.CALCULATE_SCORE est spécifiée dans "Tutoriel : Création d'une spécification de paquetage").

Etapes de déclaration des variables et des constantes dans la fonction CALCULATE_SCORE :

  1. Dans le cadre Connexions, développez hr_conn.

  2. Dans la liste des types d'objet de schéma, développez Ensembles.

  3. Dans la liste des ensembles, développez EMP_EVAL.

  4. Dans la liste des choix, cliquez avec le bouton droit de la souris sur EMP_EVAL Body.

    Une liste de choix s'affiche.

  5. Dans la liste des choix, sélectionnez Modifier.

    Le volet EMP_EVAL Body apparaît et affiche le code du corps du package :

     CREATE OR REPLACE
     PACKAGE BODY EMP_EVAL AS
    
       PROCEDURE eval_department ( dept_id IN NUMBER ) AS
    
       BEGIN
    
         -- TODO implementation required for PROCEDURE EMP_EVAL.eval_department
         NULL;
       END eval_department;
    
       FUNCTION calculate_score ( evaluation_id IN NUMBER
                               , performance_id IN NUMBER)
                               RETURN NUMBER AS
       BEGIN
    
         -- TODO implementation required for FUNCTION EMP_EVAL.calculate_score
         RETURN NULL;
       END calculate_score;
    
     END EMP_EVAL;
    
  6. Entre RETURN NUMBER AS et BEGIN, ajoutez ces déclarations de variable et de constante :

     n_score       NUMBER(1,0);                -- variable
     n_weight      NUMBER;                     -- variable
     max_score     CONSTANT NUMBER(1,0) := 9;  -- constant, initial value 9
    
     max_weight    CONSTANT NUMBER(8,8) := 1;  -- constant, initial value 1
    
     The title of the EMP_EVAL Bodypane changes to italic font, indicating that the code is not saved in the database.
    
  7. Dans le menu Fichier, sélectionnez Enregistrer.

    Oracle Database compile et enregistre le corps du package modifié. Le titre du volet Corps EMP_EVAL n'est plus en italique.

Voir aussi :

S'assurer que les variables, les constantes et les paramètres ont des types de données corrects

Assurez-vous que les variables, les constantes et les paramètres ont les bons types de données en les déclarant avec l'attribut %TYPE.

Après "Tutoriel : Déclaration de variables et de constantes dans un sous-programme", le code de la fonction EMP_EVAL.CALCULATE_SCORE est le suivant :

FUNCTION calculate_score ( evaluation_id IN NUMBER
                          , performance_id IN NUMBER )
                          RETURN NUMBER AS
  n_score       NUMBER(1,0);                -- variable
  n_weight      NUMBER;                     -- variable
  max_score     CONSTANT NUMBER(1,0) := 9;  -- constant, initial value 9
  max_weight    CONSTANT NUMBER(8,8) := 1;  -- constant, initial value 1
  BEGIN
    -- TODO implementation required for FUNCTION EMP_EVAL.calculate_score
    RETURN NULL;
  END calculate_score;

Les variables, constantes et paramètres de la fonction représentent les valeurs des tables SCORES et PERFORMANCE_PARTS (créées dans "Création de tables") :

Par conséquent, chaque variable, constante et paramètre a le même type de données que sa colonne correspondante.

Si les types de données des colonnes changent, vous souhaitez que les types de données des variables, des constantes et des paramètres soient remplacés par les mêmes types de données. Sinon, la fonction CALCULATE_SCORE est invalidée.

Pour vous assurer que les types de données des variables, constantes et paramètres correspondent toujours à ceux des colonnes, déclarez-les avec l'attribut %TYPE. L'attribut %TYPE fournit le TYPE de données d'une colonne de table ou d'une autre variable, ce qui garantit l'affectation correcte du TYPE de données.

Voir aussi :

Tutoriel : Modification des déclarations pour utiliser l'attribut %TYPE

Ce tutoriel explique comment utiliser l'outil Edit de SQL Developer pour modifier les déclarations des variables, des constantes et des paramètres formels de la fonction EMP_EVAL.CALCULATE_SCORE afin d'utiliser l'attribut %TYPE.

La fonction EMP_EVAL.CALCULATE_SCORE est affichée dans "Tutoriel : Déclaration de variables et de constantes dans un sous-programme".

Étapes de modification des déclarations dans CALCULATE_SCORE pour utiliser %TYPE :

  1. Dans le cadre Connexions, développez hr_conn.

  2. Dans la liste des types d'objet de schéma, développez Ensembles.

  3. Dans la liste des ensembles, développez EMP_EVAL.

  4. Dans la liste des choix, cliquez avec le bouton droit de la souris sur EMP_EVAL Body.

  5. Dans la liste des choix, sélectionnez Modifier.

    Le volet EMP_EVAL Bodypane apparaît et affiche le code du corps du package :

     CREATE OR REPLACE
     PACKAGE BODY emp_eval AS
    
       PROCEDURE eval_department ( dept_id IN NUMBER ) AS
       BEGIN
    
         -- TODO implementation required for PROCEDURE EMP_EVAL.eval_department
         NULL;
       END eval_department;
    
       FUNCTION calculate_score ( evaluation_id IN NUMBER
                               , performance_id IN NUMBER )
                               RETURN NUMBER AS
       n_score       NUMBER(1,0);                -- variable
       n_weight      NUMBER;                     -- variable
       max_score     CONSTANT NUMBER(1,0) := 9;  -- constant, initial value 9
    
       max_weight    CONSTANT NUMBER(8,8) := 1;  -- constant, initial value 1
    
       BEGIN
    
         -- TODO implementation required for FUNCTION EMP_EVAL.calculate_score
         RETURN NULL;
       END calculate_score;
    
     END emp_eval;
    
  6. Dans le code de la fonction, apportez les modifications suivantes :

     FUNCTION calculate_score ( evaluation_id IN SCORES.EVALUATION_ID%TYPE
                               , performance_id IN SCORES.PERFORMANCE_ID%TYPE)
                               RETURN NUMBER AS
     n_score       SCORES.SCORE%TYPE;
     n_weight      PERFORMANCE_PARTS.WEIGHT%TYPE;
     max_score     CONSTANT SCORES.SCORE%TYPE := 9;
     max_weight    CONSTANT PERFORMANCE_PARTS.WEIGHT%TYPE := 1;
    
  7. Cliquez avec le bouton droit de la souris sur EMP_EVAL.

  8. Dans la liste des choix, sélectionnez Modifier.

    Le volet EMP_EVAL s'ouvre et affiche l'instruction CREATE PACKAGE qui a créé le PACKAGE :

     CREATE OR REPLACE PACKAGE EMP_EVAL AS
    
     PROCEDURE eval_department(dept_id IN NUMBER);
     FUNCTION calculate_score(evaluation_id IN NUMBER
                             , performance_id IN NUMBER)
                               RETURN NUMBER;
    
     END EMP_EVAL;
    
  9. Dans le code de la fonction, apportez les modifications suivantes :

     FUNCTION calculate_score(evaluation_id IN scores.evaluation_id%TYPE
                             , performance_id IN scores.performance_id%TYPE)
    
  10. Cliquez avec le bouton droit de la souris sur EMP_EVAL.

  11. Dans la liste des choix, sélectionnez Compiler.

  12. Cliquez avec le bouton droit de la souris sur EMP_EVAL Body.

  13. Dans la liste des choix, sélectionnez Compiler.

Affecter des valeurs à des variables

Vous pouvez affecter une valeur à une variable comme suit :

Voir aussi :

Affecter des valeurs à des variables avec l'opérateur d'affectation

Avec l'opérateur d'affectation (:=), vous pouvez affecter la valeur d'une expression à une variable dans la partie déclarative ou exécutable d'un sous-programme.

Dans la partie déclarative d'un sous-programme, vous pouvez affecter une valeur initiale à une variable lorsque vous la déclarez. La syntaxe est :

variable_name data_type := expression;

Dans la partie exécutable d'un sous-programme, vous pouvez affecter une valeur à une variable avec une instruction d'affectation. La syntaxe est :

variable_name := expression;

Exemple 5-1 affiche les modifications à apporter à la fonction EMP_EVAL.CALCULATE_SCORE pour ajouter une variable, running_total, et l'utiliser comme valeur de retour de la fonction. L'opérateur d'affectation apparaît à la fois dans les parties déclarative et exécutable de la fonction. (Le TYPE de données running_total doit être NUMBER, plutôt que SCORES.SCORE%TYPE ou PERFORMANCE_PARTS.WEIGHT%TYPE, car il contient le produit de deux valeurs NUMBER avec des précisions et des échelles différentes.)

Voir aussi :

Exemple 5-1 : Affecter des valeurs à une variable avec un opérateur Affectation

FUNCTION calculate_score(evaluation_id IN SCORES.EVALUATION_ID%TYPE
                         , performance_id IN SCORES.PERFORMANCE_ID%TYPE)
                         RETURN NUMBER AS
  n_score       SCORES.SCORE%TYPE;
  n_weight      PERFORMANCE_PARTS.WEIGHT%TYPE;
  running_total NUMBER := 0;
  max_score     CONSTANT SCORES.SCORE%TYPE := 9;
  max_weight    CONSTANT PERFORMANCE_PARTS.WEIGHT%TYPE:= 1;
BEGIN
  running_total := max_score * max_weight;
  RETURN running_total;
END calculate_score;

Affecter des valeurs à des variables avec l'instruction SELECT INTO

Pour utiliser des valeurs de table dans des sous-programmes ou des packages, vous devez les affecter à des variables avec des instructions SELECT INTO. Exemple 5-2 affiche les modifications à apporter à la fonction EMP_EVAL.CALCULATE_SCORE pour qu'elle calcule running_total à partir des valeurs de table.

La procédure ADD_EVAL dans l'exemple 5-3 insère une rangée dans la table EVALUATIONS, en utilisant les valeurs de la rangée correspondante dans la table EMPLOYEES. Ajoutez la procédure ADD_EVAL au corps du package EMP_EVAL, mais pas à la spécification. Comme ce n'est pas dans la spécification, ADD_EVAL est local pour le package. Il ne peut être appelé que par d'autres sous-programmes du package, et non par l'extérieur du package.

Voir aussi : Informations de référence sur le langage PL/SQL pour Oracle Database pour plus d'informations sur l'énoncé SELECT INTO

Exemple 5-2 : Affecter des valeurs de table à des variables avec SELECT INTO

FUNCTION calculate_score ( evaluation_id IN scores.evaluation_id%TYPE
                         , performance_id IN scores.performance_id%TYPE )
                         RETURN NUMBER AS

  n_score       scores.score%TYPE;
  n_weight      performance_parts.weight%TYPE;
  running_total NUMBER := 0;
  max_score     CONSTANT scores.score%TYPE := 9;
  max_weight    CONSTANT performance_parts.weight%TYPE:= 1;
BEGIN
  SELECT s.score INTO n_score
  FROM SCORES s
  WHERE evaluation_id = s.evaluation_id
  AND performance_id = s.performance_id;

  SELECT p.weight INTO n_weight
  FROM PERFORMANCE_PARTS p
  WHERE performance_id = p.performance_id;

  running_total := n_score * n_weight;
  RETURN running_total;
END calculate_score;

Exemple 5-3 : Insérer une rangée de table avec des valeurs d'une autre table

PROCEDURE add_eval ( employee_id IN EMPLOYEES.EMPLOYEE_ID%TYPE
                   , today IN DATE )
AS
  job_id         EMPLOYEES.JOB_ID%TYPE;
  manager_id     EMPLOYEES.MANAGER_ID%TYPE;
  department_id  EMPLOYEES.DEPARTMENT_ID%TYPE;
BEGIN
  INSERT INTO EVALUATIONS (
    evaluation_id,
    employee_id,
    evaluation_date,
    job_id,
    manager_id,
    department_id,
    total_score
  )
  SELECT
    evaluations_sequence.NEXTVAL,   -- evaluation_id
    add_eval.employee_id,      -- employee_id
    add_eval.today,            -- evaluation_date
    e.job_id,                  -- job_id
    e.manager_id,              -- manager_id
    e.department_id,           -- department_id
    0                          -- total_score
  FROM employees e;

  IF SQL%ROWCOUNT = 0 THEN
    RAISE NO_DATA_FOUND;
  END IF;
END add_eval;