Déclaration et affectation de valeurs aux variables et constantes

Une variable ou une constante déclarée dans une spécification de package est disponible pour tout programme ayant accès au package. Les variables ou constantes déclarées dans un corps ou sous-programme de package sont locales pour ce package ou sous-programme. Lorsque vous déclarez une constante, vous devez lui affecter une valeur initiale.

Le langage PL/SQL présente un avantage considérable par rapport à SQL, car il permet de déclarer et d'utiliser des variables et des constantes.

Une variable ou une constante déclarée dans une spécification de package est disponible pour tout programme ayant accès au package. Les variables ou constantes déclarées dans un corps ou sous-programme de package sont locales pour ce package ou sous-programme.

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

Les variables ou constantes peuvent présenter un type de données PL/SQL quelconque. Lors de la déclaration d'une variable, vous pouvez lui affecter une valeur initiale. Sinon, sa valeur initiale correspondra à la valeur NULL. Lorsque vous déclarez 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. Cette pratique permet d'optimiser le code compilé et facilite la maintenance du code source.

Voir aussi : Référence du langage PL/SQL d'Oracle Database pour obtenir des informations générales sur les variables et les constantes

Tutoriel : Déclaration de variables et de constantes dans un sous-programme

This tutorial shows how to use the SQL Developer tool Edit to declare variables and constants in the EMP_EVAL.CALCULATE_SCORE function. (Ce tutoriel est également un exemple de modification du corps d'un package.)

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

Etapes de déclaration de variables et de 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 Packages.

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

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

    La liste des options apparaît.

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

    Le panneau Corps EMP_EVAL apparaît avec 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 les déclarations de variables et de constantes suivantes :

     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 panneau Corps EMP_EVAL n'apparaît plus en italique.

Voir aussi :

Vérification de la validité des types de données des variables, constantes et paramètres

Assurez-vous que les variables, constantes et paramètres ont les types de données corrects 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 présente le même type de données que la colonne qui lui correspond.

Si les types de données de ces colonnes changent, vous souhaitez que les types de données de ces variables, constantes et paramètres changent de même, afin de pas invalider la fonction CALCULATE_SCORE.

Pour garantir la correspondance avec les types de données de variables, constantes et paramètres et ceux des colonnes, effectuez leur déclaration 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 de déclarations en déclarations employant l'attribut %TYPE

This tutorial shows how to use the SQL Developer tool Edit to change the declarations of the variables, constants, and formal parameters of the EMP_EVAL.CALCULATE_SCORE function to use the %TYPE attribute.

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

Pour modifier les déclarations dans CALCULATE_SCORE afin d'utiliser %TYPE, procédez Comme suit :

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

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

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

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

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

    Le panneau Corps EMP_EVAL apparaît avec 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 sur EMP_EVAL avec le bouton droit de la souris.

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

    Le panneau EMP_EVAL apparaît et affiche l'instruction CREATE PACKAGE ayant 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 sur EMP_EVAL avec le bouton droit de la souris.

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

  12. Cliquez sur le bouton droit de la souris sur Corps EMP_EVAL.

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

Attribution de valeurs à des variables

Pour affecter une valeur à une variable, vous pouvez utiliser les méthodes suivantes :

Voir aussi :

Affectation de valeurs à des variables à l'aide de l'opérateur d'affectation

L'opérateur d'affectation (:=) permet d'affecter la valeur d'une expression à une variable dans la partie déclarative ou d'exécution d'un sous-programme.

Dans la partie de déclaration d'un sous-programme, vous pouvez affecter une valeur initiale à une variable lors de sa déclaration. La syntaxe est la suivante :

variable_name data_type := expression;

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

variable_name := expression;

L'exemple 5-1 présente les modifications à apporter à la fonction EMP_EVAL.CALCULATE_SCORE pour ajouter la variable running_total et l'utiliser comme valeur renvoyée de la fonction. L'opérateur d'affectation figure à la fois dans la partie de déclaration et d'exécution de la fonction. (Le TYPE de données running_total doit être NUMBER, et non 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 Affectation de valeurs à une variable à l'aide de l'opérateur d'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;

Affectation de valeurs à des variables via l'instruction SELECT INTO

Pour utiliser des valeurs issues des tables dans un sous-programme ou un package, vous devez les affecter à des variables à l'aide d'instructions SELECT INTO. L'exemple 5-2 présente les modifications à apporter à la fonction EMP_EVAL.CALCULATE_SCORE pour qu'elle calcule running_total à partir de valeurs des tables.

La procédure ADD_EVAL de l'Exemple 5-3 insère une ligne dans la table EVALUATIONS avec les valeurs de la ligne correspondante dans la table EMPLOYEES. Ajoutez la procédure ADD_EVAL au corps du package EMP_EVAL, mais pas à la spécification. Puisqu'elle ne Figure pas dans la spécification, la fonction ADD_EVAL est locale pour le package (il peut être appelé uniquement par d'autres sous-programmes du package, pas à partir de l'extérieur du package).

Voir aussi : Oracle Database PL/SQL Language Reference, pour plus d'informations sur l'instruction SELECT INTO

Exemple 5-2 Affectation de valeur issues de tables à des variables à l'aide de l'instruction 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 Insertion d'une ligne de table avec des valeurs issues 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;