Declarando e Designando Valores às Variáveis e Constantes

Uma variável ou constante declarada em uma especificação de pacote está disponível para qualquer programa que tenha acesso ao pacote. Uma variável ou constante declarada em um corpo ou subprograma de pacote é local para esse pacote ou subprograma. Ao declarar uma constante, você deve atribuí-la a um valor inicial.

Um importante benefício que o PL/SQL apresenta, com relação ao SQL, é que o PL/SQL permite a declaração e o uso de variáveis e constantes.

Uma variável ou constante declarada em uma especificação de pacote está disponível para qualquer programa que tenha acesso ao pacote. Uma variável ou constante declarada em um corpo ou subprograma de pacote é local para esse pacote ou subprograma.

Uma variável contém um valor de um tipo de dados específico. Seu programa pode alterar o valor no tempo de execução. Uma constante contém um valor que não pode ser alterado.

Uma variável ou constante pode ter qualquer tipo de dados PL/SQL. Ao declarar uma variável, você pode designá-la a um valor inicial; caso contrário, seu valor inicial será NULO. Ao declarar uma constante, você deve atribuí-la a um valor inicial. Para atribuir um valor inicial a uma variável ou constante, use o operador de atribuição (:=).

Dica: Declare todos os valores que não mudam como constantes. Esse processo otimiza o código compilado e facilita a manutenção do seu código-fonte.

Consulte Também: Referência de Linguagem PL/SQL do Oracle Database para obter informações gerais sobre variáveis e constantes

Tutorial: Declarando Variáveis e Constantes em um Subprograma

Este tutorial mostra como usar a ferramenta de Edição do SQL Developer para declarar variáveis e constantes na função EMP_EVAL.CALCULATE_SCORE. (Este tutorial também é um exemplo de alteração do corpo do pacote.)

A função EMP_EVAL.CALCULATE_SCORE é especificada no "Tutorial: Criando uma Especificação de Pacote".

Etapas para declarar variáveis e constantes na função CALCULATE_SCORE:

  1. No quadro Conexões, expanda hr_conn.

  2. Na lista de tipos de objeto de esquema, expanda Pacotes.

  3. Na lista de pacotes, expanda EMP_EVAL.

  4. Na lista de opções, clique com o botão direito do mouse em Corpo EMP_EVAL.

    Uma lista de opções é exibida.

  5. Na lista de opções, selecione Editar.

    O painel Corpo EMP_EVAL é exibido, mostrando o código do corpo do pacote:

     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 e BEGIN, adicione estas declarações de variável e 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 1
    
     The title of the EMP_EVAL Bodypane changes to italic font, indicating that the code is not saved in the database.
    
  7. No menu Arquivo, selecione Salvar.

    O Oracle Database compila e salva o corpo alterado do pacote. O título do painel Corpo EMP_EVAL não está mais em itálico.

Consulte também:

Certificando-se de que as Variáveis, Constantes e Parâmetros Tenham os Tipos de Dados Corretos

Certifique-se de que variáveis, constantes e parâmetros tenham os tipos de dados corretos, declarando-os com o atributo %TYPE.

Após "Tutorial: Declarando Variáveis e Constantes em um Subprograma", o código da função EMP_EVAL.CALCULATE_SCORE é:

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;

As variáveis, constantes e parâmetros da função representam valores das tabelas SCORES e PERFORMANCE_PARTS (criadas em "Creating Tables"):

Portanto, cada variável, constante e parâmetro tem o mesmo tipo de dados de sua coluna correspondente.

Se os tipos de dados das colunas mudarem, você deverá alterar os tipos de dados das variáveis, constantes e parâmetros para os mesmos tipos de dados; caso contrário, a função CALCULATE_SCORE será invalidada.

Para garantir que os tipos de dados das variáveis, constantes e parâmetros sempre correspondam aos das colunas, declare-os com o atributo %TYPE. O atributo %TYPE fornece o tipo de dados de uma coluna de tabela ou outra variável, garantindo a atribuição correta do tipo de dados.

Consulte também:

Tutorial: Alterando Declarações para Usar o Atributo %TYPE

Este tutorial mostra como usar a Edição da ferramenta SQL Developer para alterar as declarações das variáveis, constantes e parâmetros formais da função EMP_EVAL.CALCULATE_SCORE para usar o atributo %TYPE.

A função EMP_EVAL.CALCULATE_SCORE é mostrada no "Tutorial: Declarando Variáveis e Constantes em um Subprograma".

Etapas para alterar as declarações em CALCULATE_SCORE para usar %TYPE:

  1. No quadro Conexões, expanda hr_conn.

  2. Na lista de tipos de objeto de esquema, expanda Pacotes.

  3. Na lista de pacotes, expanda EMP_EVAL.

  4. Na lista de opções, clique com o botão direito do mouse em Corpo EMP_EVAL.

  5. Na lista de opções, selecione Editar.

    O painel de corpo EMP_EVAL é exibido, mostrando o código do corpo do pacote:

     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. No código da função, faça as seguintes alterações:

     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. Clique com o mouse em EMP_EVAL.

  8. Na lista de opções, selecione Editar.

    O painel EMP_EVAL é aberto, mostrando a instrução CREATE PACKAGE que criou o pacote:

     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. No código da função, faça as seguintes alterações:

     FUNCTION calculate_score(evaluation_id IN scores.evaluation_id%TYPE
                             , performance_id IN scores.performance_id%TYPE)
    
  10. Clique com o mouse em EMP_EVAL.

  11. Na lista de opções, selecione Compilar.

  12. Clique com o botão direito em Corpo EMP_EVAL.

  13. Na lista de opções, selecione Compilar.

Designando Valores a Variáveis

Você pode atribuir um valor a uma variável das seguintes maneiras:

Consulte também:

Designando Valores a Variáveis com o Operador de Atribuições

Com o operador de atribuição (:=), você pode atribuir o valor de uma expressão a uma variável na parte declarativa ou executável de um subprograma.

Na parte declarativa de um subprograma, você pode designar um valor inicial para uma variável quando você declará-la. A sintaxe é:

variable_name data_type := expression;

Na parte executável de um subprograma, você pode designar um valor para uma variável com uma instrução de designação. A sintaxe é:

variable_name := expression;

O exemplo 5-1 mostra as alterações a serem feitas à função EMP_EVAL.CALCULATE_SCORE para adicionar uma variável, running_total e usá-la como o valor de retorno da função. O operador de designação aparece nas partes declarativa e executável da função. (O tipo de dados running_total deve ser NUMBER, em vez de SCORES.SCORE%TYPE ou PERFORMANCE_PARTS.WEIGHT%TYPE, porque ele contém o produto de dois valores NUMBER com diferentes precisões e escalas.)

Consulte também:

Exemplo 5-1 Atribuindo Valores a uma Variável com Operador de Atribuição

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;

Designando Valores a Variáveis com a Instrução SELECT INTO

Para usar valores de tabela em subprogramas ou pacotes, você deve atribuí-los a variáveis com instruções SELECT INTO. Exemplo 5-2 mostra as alterações que devem ser feitas na função EMP_EVAL.CALCULATE_SCORE para que ela calcule running_total dos valores da tabela.

O procedimento ADD_EVAL no Exemplo 5-3 insere uma linha na tabela EVALUATIONS, usando valores da linha correspondente na tabela EMPLOYEES. Adicione o procedimento ADD_EVAL ao corpo do pacote EMP_EVAL, mas não à especificação. Por não estar na especificação, ADD_EVAL é local para o pacote. Ele só pode ser chamado por outros subprogramas do pacote, não de fora do pacote.

Consulte Também: Referência de Linguagem PL/SQL do Oracle Database para saber mais sobre a instrução SELECT INTO

Exemplo 5-2 Atribuindo Valores de Tabela a Variáveis com 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;

Exemplo 5-3 Inserindo uma Linha de Tabela com Valores de Outra Tabela

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;