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 :
-
Dans le cadre Connexions, développez hr_conn.
-
Dans la liste des types d'objet de schéma, développez Packages.
-
Dans la liste des packages, développez EMP_EVAL.
-
Dans la liste des choix, cliquez avec le bouton droit de la souris sur Corps EVAL_EMP.
La liste des options apparaît.
-
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; -
Entre
RETURN NUMBER ASetBEGIN, 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 1The title of the EMP_EVAL Bodypane changes to italic font, indicating that the code is not saved in the database. -
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 :
-
Référence du langage PL/SQL d'Oracle Database, pour des informations générales sur la déclaration de variables et de constantes
-
Affectation de valeurs à une variable à l'aide de l'opérateur d'affectation
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) :
-
La variable n_score contiendra une valeur de la colonne SCORE.SCORES et La constante max_score sera comparée à ces valeurs.
-
La variable n_weight contiendra une valeur de la colonne PERFORMANCE_PARTS.WEIGHT et les constantes max_weight seront comparées à ces valeurs.
-
Le paramètre assessment_id contiendra une valeur de la colonne SCORE.EVALUATION_ID.
-
Le paramètre performance_id contiendra une valeur de la colonne SCORE.PERFORMANCE_ID.
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 :
-
Oracle Database PL/SQL Language Reference, pour plus d'informations sur l'attribut
%TYPE -
Manuel Oracle Database PL/SQL Language Reference, pour savoir davantage sur la syntaxe de l'attribut %TYPE
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 :
-
Dans le cadre Connexions, développez hr_conn.
-
Dans la liste des types d'objet de schéma, développez Packages.
-
Dans la liste des packages, développez EMP_EVAL.
-
Dans la liste des choix, cliquez avec le bouton droit de la souris sur Corps EVAL_EMP.
-
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; -
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; -
Cliquez sur EMP_EVAL avec le bouton droit de la souris.
-
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; -
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) -
Cliquez sur EMP_EVAL avec le bouton droit de la souris.
-
Dans la liste des choix, sélectionnez Compiler.
-
Cliquez sur le bouton droit de la souris sur Corps EMP_EVAL.
-
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 :
-
Utilisez l'opérateur d'affectation pour lui attribuer la valeur d'une expression.
-
Utilisez l'instruction SELECT INTO ou FETCH pour lui attribuer une valeur issue d'une table.
-
Transmettez-le à un sous-programme en tant que paramètre OUT ou IN OUT, puis affectez la valeur à l'intérieur du sous-programme.
-
Liez la variable à une valeur.
Voir aussi :
-
Oracle Database PL/SQL Language Reference, pour plus d'informations sur l'affectation de valeurs à des variables
-
Guide du développeur Oracle Database 2 Day + Java pour plus d'informations sur les variables de liaison
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 :
-
Manuel Oracle Database PL/SQL Language Reference, pour connaître les déclarations de variable
-
Manuel Oracle Database PL/SQL Language Reference, pour connaître l'instruction d'affectation
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;