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 :
-
Dans le cadre Connexions, développez hr_conn.
-
Dans la liste des types d'objet de schéma, développez Ensembles.
-
Dans la liste des ensembles, développez EMP_EVAL.
-
Dans la liste des choix, cliquez avec le bouton droit de la souris sur EMP_EVAL Body.
Une liste de choix s'affiche.
-
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; -
Entre
RETURN NUMBER ASetBEGIN, 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 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 volet Corps EMP_EVAL n'est plus en italique.
Voir aussi :
-
Informations de référence sur le langage PL/SQL pour Oracle Database pour des informations générales sur la déclaration de variables et de constantes
-
"Affectation de valeurs à des variables avec l'opérateur d'affectation"
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") :
-
La variable n_score contiendra une valeur de la colonne SCORE.SCORES et la constante max_score sera comparée à de telles valeurs.
-
La variable n_weight contiendra une valeur de la colonne PERFORMANCE_PARTS.WEIGHT et la constante max_weight sera comparée à de telles valeurs.
-
Le paramètre assessment_id contient une valeur de la colonne SCORE.EVALUATION_ID.
-
Le paramètre performance_id contient une valeur de la colonne SCORE.PERFORMANCE_ID.
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 :
-
Informations de référence sur le langage PL/SQL pour Oracle Database pour plus d'informations sur l'attribut
%TYPE -
Informations de référence sur le langage PL/SQL pour Oracle Database pour la syntaxe de l'attribut %TYPE
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 :
-
Dans le cadre Connexions, développez hr_conn.
-
Dans la liste des types d'objet de schéma, développez Ensembles.
-
Dans la liste des ensembles, développez EMP_EVAL.
-
Dans la liste des choix, cliquez avec le bouton droit de la souris sur EMP_EVAL Body.
-
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; -
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 avec le bouton droit de la souris sur EMP_EVAL.
-
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; -
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 avec le bouton droit de la souris sur EMP_EVAL.
-
Dans la liste des choix, sélectionnez Compiler.
-
Cliquez avec le bouton droit de la souris sur EMP_EVAL Body.
-
Dans la liste des choix, sélectionnez Compiler.
Affecter des valeurs à des variables
Vous pouvez affecter une valeur à une variable comme suit :
-
Utilisez l'opérateur d'affectation pour lui affecter la valeur d'une expression.
-
Utilisez l'instruction SELECT INTO ou FETCH pour lui affecter une valeur provenant 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 :
-
Informations de référence sur le langage PL/SQL pour Oracle Database pour plus d'informations sur l'affectation de valeurs à des variables
-
Oracle Database 2 Day + Java Developer's Guide pour plus d'informations sur les variables de liaison
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 :
-
Informations de référence sur le langage PL/SQL pour Oracle Database pour la syntaxe de déclaration de variable
-
Informations de référence sur le langage PL/SQL pour Oracle Database pour la syntaxe d'énoncé d'affectation
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;