Declaración y Asignación de Valores a Variables y Constantes
Una variable o constante declarada en una especificación de paquete está disponible para cualquier programa que tenga acceso al paquete. Una variable o constante declarada en un cuerpo o subprograma de paquete es local para ese paquete o subprograma. Al declarar una constante, debe asignarle un valor inicial.
Una ventaja significativa que tiene PL/SQL sobre SQL es que PL/SQL le permite declarar y utilizar variables y constantes.
Una variable o constante declarada en una especificación de paquete está disponible para cualquier programa que tenga acceso al paquete. Una variable o constante declarada en un cuerpo o subprograma de paquete es local para ese paquete o subprograma.
Una variable contiene un valor de un tipo del dato particular. Su programa puede cambiar el valor en ejecución. Una constante contiene un valor que no se puede cambiar.
Una variable o una constante pueden tener cualquier tipo de dato PL/SQL. Al declarar una variable, puede asignarle un valor inicial; si no lo hace, su valor inicial será NULL. Al declarar una constante, debe asignarle un valor inicial. Para asignar un valor inicial a una variable o una constante, utilice el operador de asignación (:=).
Consejo: Declare todos los valores que no cambian como constantes. Esta práctica optimiza el código compilado y facilita el mantenimiento del código fuente.
Consulte también: Referencia de lenguaje PL/SQL de Oracle Database para obtener información general sobre variables y constantes
Tutorial: Declaración de Variables y Constantes en un Subprograma
En este tutorial se muestra cómo utilizar la herramienta Editar de SQL Developer para declarar variables y constantes en la función EMP_EVAL.CALCULATE_SCORE. (Este tutorial es también un ejemplo de cambio de un cuerpo de paquete.)
La función EMP_EVAL.CALCULATE_SCORE se especifica en "Tutorial: Creación de una Especificación de Paquete".
Pasos para declarar variables y constantes en la función CALCULATE_SCORE:
-
En el marco Conexiones, expanda hr_conn.
-
En la lista de tipos de objetos de esquema, amplíe Paquetes.
-
En la lista de paquetes, expanda EMP_EVAL.
-
En la lista de opciones, haga clic con el botón derecho en EMP_EVAL Body (Cuerpo EVAL).
Aparecerá una lista de opciones.
-
En la lista de opciones, seleccione Editar.
Aparecerá el panel del cuerpo de EMP_EVAL, en el que se mostrará los códigos del cuerpo del paquete:
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 ASyBEGIN, agregue estas declaraciones de variables y constantes: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. -
En el menú Archivo, seleccione Guardar.
Oracle Database guarda y compila el cuerpo cambiado del paquete. El título del panel del cuerpo EMP_EVAL deja de aparecer en cursiva.
Consulte además:
-
Referencia de lenguaje PL/SQL de Oracle Database para obtener información general sobre la declaración de variables y constantes
-
"Asignación de Valores a Variables con el Operador de Asignación"
Comprobación de que las Variables, las Constantes y los Parámetros Tienen Tipos de Datos Correctos
Asegúrese de que las variables, constantes y parámetros tienen los tipos de dato correctos declarándolos con el atributo %TYPE.
Después de "Tutorial: Declaración de Variables y Constantes en un Subprograma, el código para la función EMP_EVAL.CALCULATE_SCORE es:
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;
Las variables, constantes y parámetros de la función representan valores de las tablas SCORES y PERFORMANCE_PARTS (creadas en "Creating Tables"):
-
La variable n_score contendrá un valor de la columna SCORE.SCORES y se comparará la constante max_score con esos valores.
-
La variable n_weight contendrá un valor de la columna PERFORMANCE_PARTS.WEIGHT y las constantes max_weight se compararán con esos valores.
-
El parámetro assessment_id contendrá un valor de la columna SCORE.EVALUATION_ID.
-
El parámetro performance_id contendrá un valor de la columna SCORE.PERFORMANCE_ID.
Por lo tanto, cada variable, constante y parámetro tiene el mismo tipo de dato que su columna correspondiente.
Si los tipos de datos de las columnas cambian, deberá cambiar los tipos de datos de las variables, las constantes y la parámetros a los mismos tipos de dato; de lo contrario, la función CALCULATE_SCORE se invalidará.
Para asegurarse que los tipos de dato de las variables, las constantes y Los parámetros coincidan siempre en los de las columnas, declárelas con el atributo %TYPE. El atributo %TYPE suministra el tipo de datos de una columna de la tabla o de otra variable, asegurando la asignación correcta del tipo de datos.
Consulte además:
-
Para obtener más información sobre el atributo
%TYPE, consulte Oracle Database PL/SQL Language Reference -
Oracle Database PL/SQL Language Reference para obtener más información sobre la sintaxis del atributo %TYPE
Tutorial: Cambio de Declaraciones para Utilizar el Atributo %TYPE
Este tutorial muestra cómo utilizar la herramienta Edición de SQL Developer para cambiar las declaraciones de las variables, constantes y parámetros formales de la función EMP_EVAL.CALCULATE_SCORE para utilizar el atributo %TYPE.
La función EMP_EVAL.CALCULATE_SCORE se muestra en "Tutorial: Declaración de Variables y Constantes en un Subprograma".
Pasos para cambiar las declaraciones en CALCULATE_SCORE para utilizar %TYPE:
-
En el marco Conexiones, expanda hr_conn.
-
En la lista de tipos de objetos de esquema, amplíe Paquetes.
-
En la lista de paquetes, expanda EMP_EVAL.
-
En la lista de opciones, haga clic con el botón derecho en EMP_EVAL Body (Cuerpo EVAL).
-
En la lista de opciones, seleccione Editar.
Aparecerá el panel del cuerpo EMP_EVAL, en el que se muestra el código del cuerpo del paquete:
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; -
En el código de la función, realice los siguientes cambios:
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; -
Haga clic con el mouse en EMP_EVAL.
-
En la lista de opciones, seleccione Editar.
Se abrirá el panel EMP_EVAL en el que se mostrará el comando CREATE PACKAGE que ha creado el paquete:
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; -
En el código de la función, realice los siguientes cambios:
FUNCTION calculate_score(evaluation_id IN scores.evaluation_id%TYPE , performance_id IN scores.performance_id%TYPE) -
Haga clic con el mouse en EMP_EVAL.
-
En la lista de opciones, seleccione Compilar.
-
Haga clic con el botón secundario en Cuerpo de EMP_EVAL.
-
En la lista de opciones, seleccione Compilar.
Asignación de Valores a Variables
Puede asignar un valor a una variable de las formas siguientes:
-
Utilice el operador de asignación para asignarle el valor de una expresión.
-
Utilice la sentencia SELECT INTO o FETCH para asignarle un valor de una tabla.
-
Pásela a un subprograma como un parámetro OUT o IN OUT y, a continuación, asigne el valor dentro del subprograma.
-
Enlace la variable a un valor.
Consulte además:
-
Referencia de lenguaje PL/SQL de Oracle Database para obtener más información sobre la asignación de valores a variables
-
Oracle Database 2 Day + Java Developer's Guide para obtener información sobre las variables de enlace
Asignación de Valores a Variables con el Operador de Asignación
Con el operador de asignación (:=), puede asignar el valor de una expresión a una variable en la parte declarativa o ejecutable de un subprograma.
En la parte declarativa de un subprograma, puede asignar un valor inicial a una variable al declararla. La sintaxis es:
variable_name data_type := expression;
En la parte ejecutable de un subprograma, puede asignar un valor a una variable con una sentencia de asignación. La sintaxis es:
variable_name := expression;
En el ejemplo 5-1 se muestran los cambios que se han de realizar a la función EMP_EVAL.CALCULATE_SCORE para agregar una variable, running_total, y utilizarla como valor de retorno de la función. El operador de asignación aparece tanto en la parte declarativa como en la parte ejecutable de la función. (El tipo de datos de running_total debe ser NUMBER, en lugar de SCORES.SCORE%TYPE o PERFORMANCE_PARTS.WEIGHT%TYPE, puesto que contiene el producto de dos valores NUMBER con las precisiones y escalas diferentes.)
Consulte además:
-
Referencia de lenguaje PL/SQL de Oracle Database para obtener la sintaxis sobre la declaración de variables
-
Referencia de lenguaje PL/SQL de Oracle Database para obtener información sobre las instrucciones de asignación
Ejemplo 5-1 Asignación de Valores a una Variable con un Operador de Asignación
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;
Asignación de Valores a Variables con la Sentencia SELECT INTO
Para utilizar valores de la tabla en subprogramas o paquetes, debe asignarlos a las variables con las sentencias SELECT INTO. En el Ejemplo 5-2 se muestran los cambios que se han de realizar a la función EMP_EVAL.CALCULATE_SCORE para que calcule run_total a partir de los valores de la tabla.
El procedimiento ADD_EVAL del Ejemplo 5-3 inserta una fila en la tabla EVALUATIONS, con el uso de los valores de la fila correspondiente en la tabla EMPLOYEES. Agregue el procedimiento ADD_EVAL al cuerpo del paquete EMP_EVAL, pero no a la especificación. Debido al hecho de que no está en la especificación, ADD_EVAL es local para el paquete; sólo puede ser invocado por otros subprogramas en el paquete, no desde fuera del paquete.
Consulte también: Referencia de lenguaje PL/SQL de Oracle Database para obtener más información sobre la sentencia SELECT INTO
Ejemplo 5-2 Asignación de Valores de Tabla a Variables con 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;
Ejemplo 5-3 Inserción de una Fila de Tabla con Valores de Otra Tabla
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;