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:
-
No quadro Conexões, expanda hr_conn.
-
Na lista de tipos de objeto de esquema, expanda Pacotes.
-
Na lista de pacotes, expanda EMP_EVAL.
-
Na lista de opções, clique com o botão direito do mouse em Corpo EMP_EVAL.
Uma lista de opções é exibida.
-
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; -
Entre
RETURN NUMBER ASeBEGIN, 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 1The title of the EMP_EVAL Bodypane changes to italic font, indicating that the code is not saved in the database. -
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:
-
Oracle Database PL/SQL Language Reference para obter informações gerais sobre como declarar variáveis e constantes
-
"Atribuindo Valores a Variáveis com o Operador de Designação"
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"):
-
A variável n_score conterá um valor da coluna SCORE.SCORES e o max_score constante será comparado a esses valores.
-
A variável n_weight conterá um valor da coluna PERFORMANCE_PARTS.WEIGHT e a constante max_weight será comparada a esses valores.
-
O parâmetro evaluation_id conterá um valor da coluna SCORE.EVALUATION_ID.
-
O parâmetro performance_id conterá um valor da coluna SCORE.PERFORMANCE_ID.
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:
-
Referência de Linguagem do Oracle Database PL/SQL para mais informações sobre o atributo
%TYPE -
Referência de Linguagem do Oracle Database PL/SQL para a sintaxe do atributo %TYPE
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:
-
No quadro Conexões, expanda hr_conn.
-
Na lista de tipos de objeto de esquema, expanda Pacotes.
-
Na lista de pacotes, expanda EMP_EVAL.
-
Na lista de opções, clique com o botão direito do mouse em Corpo EMP_EVAL.
-
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; -
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; -
Clique com o mouse em EMP_EVAL.
-
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; -
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) -
Clique com o mouse em EMP_EVAL.
-
Na lista de opções, selecione Compilar.
-
Clique com o botão direito em Corpo EMP_EVAL.
-
Na lista de opções, selecione Compilar.
Designando Valores a Variáveis
Você pode atribuir um valor a uma variável das seguintes maneiras:
-
Use o operador de designação para atribuir a ele o valor de uma expressão.
-
Use a instrução SELECT INTO ou FETCH para atribuí-la a um valor de uma tabela.
-
Passá-lo para um subprograma como um parâmetro OUT ou IN OUT e, em seguida, atribuir o valor dentro do subprograma.
-
Associe a variável a um valor.
Consulte também:
-
Referência da Linguagem PL/SQL do Oracle Database para mais informações sobre como atribuir valores a variáveis
-
Oracle Database 2 Day + Java Developer's Guide para obter informações sobre variáveis de associação
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:
-
Referência de Linguagem PL/SQL do Oracle Database para a sintaxe da declaração de variável
-
Referência de Linguagem PL/SQL do Oracle Database para sintaxe da instrução da designação
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;