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:

  1. En el marco Conexiones, expanda hr_conn.

  2. En la lista de tipos de objetos de esquema, amplíe Paquetes.

  3. En la lista de paquetes, expanda EMP_EVAL.

  4. En la lista de opciones, haga clic con el botón derecho en EMP_EVAL Body (Cuerpo EVAL).

    Aparecerá una lista de opciones.

  5. 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;
    
  6. Entre RETURN NUMBER AS y BEGIN, 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 1
    
     The title of the EMP_EVAL Bodypane changes to italic font, indicating that the code is not saved in the database.
    
  7. 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:

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"):

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:

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:

  1. En el marco Conexiones, expanda hr_conn.

  2. En la lista de tipos de objetos de esquema, amplíe Paquetes.

  3. En la lista de paquetes, expanda EMP_EVAL.

  4. En la lista de opciones, haga clic con el botón derecho en EMP_EVAL Body (Cuerpo EVAL).

  5. 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;
    
  6. 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;
    
  7. Haga clic con el mouse en EMP_EVAL.

  8. 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;
    
  9. 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)
    
  10. Haga clic con el mouse en EMP_EVAL.

  11. En la lista de opciones, seleccione Compilar.

  12. Haga clic con el botón secundario en Cuerpo de EMP_EVAL.

  13. En la lista de opciones, seleccione Compilar.

Asignación de Valores a Variables

Puede asignar un valor a una variable de las formas siguientes:

Consulte además:

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:

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;