Dichiarazione e assegnazione di valori a variabili e costanti
Una variabile o una costante dichiarata in una specifica di pacchetto è disponibile per qualsiasi programma che ha accesso al pacchetto. Una variabile o un costante dichiarata in un package body o in una sottoprogramma è locale rispetto al package o a un sottoprogramma. Quando ci si dichiara una costante, è necessario assegnare alla stessa un valore iniziale.
Un vantaggio significativo di PL/SQL rispetto a SQL è la possibilità di dichiarare e utilizzare le variabili e i vincoli.
Una variabile o una costante dichiarata in una specifica di pacchetto è disponibile per qualsiasi programma che ha accesso al pacchetto. Una variabile o un costante dichiarata in un package body o in una sottoprogramma è locale rispetto al package o a un sottoprogramma.
Una variabile contiene un valore di un particolare tipo di dati. Il programma può modificare il valore in fase di runtime. Una costante contiene un valore che non può essere modificato.
Una variabile o una costante possono avere qualsiasi tipo di dati PL/SQL. Quando viene dichiarata una variabile, è possibile assegnare alla stessa un valore iniziale; se non si effettua tale azione, il valore iniziale è NULL. Quando ci si dichiara una costante, è necessario assegnare alla stessa un valore iniziale. Per assegnare un valore iniziale a una variabile o a un costante, utilizzare l'operatore di assegnazione (:=).
Suggerimento: dichiarare tutti i valori che non cambiano come costanti. Questa pratica ottimizza il codice compilato e semplifica la gestione del codice sorgente.
Vedere anche: Oracle Database PL/SQL Language Reference per informazioni generali su variabili e costanti
Esercitazione: Dichiarazione di variabili e costanti in un sottoprogramma
Questa esercitazione mostra come utilizzare lo strumento Modifica di SQL Developer per dichiarare variabili e costanti nella funzione EMP_EVAL.CALCULATE_SCORE. Questa esercitazione è anche un esempio di modifica di un package body.
La funzione EMP_EVAL.CALCULATE_SCORE è specificata in "Esercitazione: creazione di una specifica di package").
Per dichiarare variabili e costanti nella funzione CALCULATE_SCORE, procedere come segue.
-
Nel frame Connessioni espandere hr_conn.
-
Nella lista dei tipi di oggetto schema espandere Pacchetti.
-
Nell'elenco dei pacchetti espandere EMP_EVAL.
-
Nell'elenco delle opzioni, fare clic con il pulsante destro del mouse su Corpo EMP_EVAL.
Viene visualizzata una lista di scelte.
-
Nell'elenco di scelte, selezionare Modifica.
Viene visualizzato un riquadro Corpo EMP_EVAL, in cui è mostrato il codice per il package body:
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; -
Tra
RETURN NUMBER ASeBEGINaggiungere le seguenti dichiarazioni di variabili e costanti: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. -
Dal menu File, selezionare Salva.
Oracle Database compila e salva il package body modificato. Il titolo del riquadro Corpo EMP_EVAL non è più in corsivo.
Vedere anche:
-
Oracle Database PL/SQL Language Reference per informazioni generali sulla dichiarazione di variabili e costanti
-
"Assegnazione di valori alle variabili con l'operatore di assegnazione"
Assicurarsi che i tipi di dati di variabili, costanti e parametri siano corretti
Assicurarsi che le variabili, le costanti e i parametri abbiano i tipi di dati corretti dichiarandoli con l'attributo %TYPE.
Dopo "Esercitazione: Dichiarazioni di variabili e costanti in un sottoprogramma", il codice per la funzione 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;
Le variabili, le costanti e i parametri della funzione rappresentano i valori delle tabelle SCORES e PERFORMANCE_PARTS (create in "Creazione di tabelle"):
-
La variabile n_score conterrà un valore della colonna SCORE.SCORES e il valore max_score costante verrà confrontato con tali valori.
-
La variabile n_weight conterrà un valore della colonna PERFORMANCE_PARTS.WEIGHT e il peso max_weight costante verrà confrontato con tali valori.
-
Il parametro evaluation_id conterrà un valore della colonna SCORE.EVALUATION_ID.
-
Il parametro performance_id conterrà un valore della colonna SCORE.PERFORMANCE_ID.
Pertanto, ogni variabile, costante e parametro ha lo stesso tipo di dati della colonna corrispondente.
Se i tipi di dati delle colonne cambiano, è necessario che anche i tipi di dati delle variabili, delle costanti e dei parametri vengano modificati di seguito; altrimenti, la funzione CALCULATE_SCORE diventa non valida.
Per assicurarsi che i tipi di dati delle variabili, costanti e parametri corrispondano sempre con quelli delle colonne, dichiararli con l'attributo %TYPE. L'attributo %TYPE fornisce il tipo di dati di una colonna di tabella o un'altra variabile, garantendo l'assegnazione del tipo di dati corretta.
Vedere anche:
-
Oracle Database PL/SQL Language Reference per ulteriori informazioni sull'attributo
%TYPE -
Oracle Database PL/SQL Language Reference per la sintassi dell'attributo %TYPE
Esercitazione: Modifica delle dichiarazioni per l'uso dell'attributo %TYPE
Questa esercitazione mostra come utilizzare lo strumento SQL Developer Modifica per modificare le dichiarazioni delle variabili, delle costanti e dei parametri formali della funzione EMP_EVAL.CALCULATE_SCORE in dichiarazioni che utilizzano l'attributo %TYPE.
La funzione EMP_EVAL.CALCULATE_SCORE viene visualizzata in "Esercitazione: dichiarazione di variabili e costanti in un sottoprogramma".
Passi per modificare le dichiarazioni in CALCULATE_SCORE in modo da utilizzare %TYPE,
-
Nel frame Connessioni espandere hr_conn.
-
Nella lista dei tipi di oggetto schema espandere Pacchetti.
-
Nell'elenco dei pacchetti espandere EMP_EVAL.
-
Nell'elenco delle opzioni, fare clic con il pulsante destro del mouse su Corpo EMP_EVAL.
-
Nell'elenco di scelte, selezionare Modifica.
Viene visualizzato il riquadro Corpo EMP_EVAL, in cui è mostrato il codice per il package body.
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; -
Nel codice della funzione, apportare le seguenti modifiche:
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; -
fare clic con il pulsante destro del mouse su EMP_EVAL.
-
Nell'elenco di scelte, selezionare Modifica.
Viene visualizzato il riquadro EMP_EVAL che mostra l'istruzione CREATE PACKAGE che ha creato il 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; -
Nel codice della funzione, apportare le seguenti modifiche:
FUNCTION calculate_score(evaluation_id IN scores.evaluation_id%TYPE , performance_id IN scores.performance_id%TYPE) -
fare clic con il pulsante destro del mouse su EMP_EVAL.
-
Nell'elenco di opzioni, selezionare Compila.
-
Fare clic con un pulsante destro del mouse su Corpo EMP_EVAL.
-
Nell'elenco di opzioni, selezionare Compila.
Assegnazione di valori alle variabili
È possibile assegnare un valore a una variabile mediante i metodi descritti di seguito:
-
Utilizzare l'operatore di assegnazione per assegnare il valore di un'espressione.
-
Utilizzare l'istruzione SELECT INTO o FETCH per assegnare un valore da una tabella.
-
Passarlo a un sottoprogramma come parametro OUT o IN OUT, quindi assegnare il valore nel sottoprogramma.
-
Associare la variabile a un valore.
Vedere anche:
-
Oracle Database PL/SQL Language Reference per ulteriori informazioni sull'assegnazione di valori alle variabili
-
Oracle Database 2 Day + Java Developer's Guide per informazioni sulle variabili di associazione
Assegnazione di valori alle variabili con l'operatore di assegnazione
Con l'operatore di assegnazione (:=) è possibile assegnare il valore di un'espressione a una variabile nella parte dichiarativa o eseguibile di un sottoprogramma.
Nella parte dichiarativa di un sottoprogramma, è possibile assegnare un valore iniziale a una variabile quando la si dichiara. La sintassi è:
variable_name data_type := expression;
Nella parte eseguibile di un sottoprogramma è possibile assegnare un valore a una variabile con un'istruzione di assegnazione. La sintassi è:
variable_name := expression;
L'Esempio 5-1 mostra le modifiche da apportare alla funzione EMP_EVAL.CALCULATE_SCORE per aggiungere una variabile, running_total, e la utilizza come valore restituito della funzione. L'operatore di assegnazione compare sia nella parte dichiarativa che nella parte eseguibile della funzione. Il tipo di dati di running_total deve essere NUMBER anziché SCORES.SCORE%TYPE o PERFORMANCE_PARTS.WEIGHT%TYPE, in quanto contiene il prodotto di due valori NUMBER con precisioni e scale differenti.
Vedere anche:
-
Oracle Database PL/SQL Language Reference per l'uso della sintassi delle dichiarazioni variabili
-
Oracle Database PL/SQL Language Reference per la sintassi delle istruzioni di assegnazione
Esempio 5-1 Assegnazione di valori a una variabile con l'operatore di assegnazione
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;
Assegnazione di valori alle variabili con l'istruzione SELECT INTO
Per utilizzare i valori delle tabelle nei sottoprogrammi o Nei package, è necessario assegnarli alle variabili con le istruzioni SELECT INTO. Nell'Esempio 5-2 vengono illustrate le modifiche che devono essere apportate alla funzione EMP_EVAL.CALCULATE_SCORE per eseguire il calcolo running_total dai valori della tabella.
La procedura ADD_EVAL nell'Esempio 5-3 inserisce una riga nella tabella EVALUATIONS, utilizzando i valori della riga corrispondente nella tabella EMPLOYEES. Aggiungere la procedura ADD_EVAL al corpo del package EMP_EVAL, ma non alla specifica. Poiché non si trova nella specifica, la funzione ADD_EVAL è locale rispetto al package, ovvero può essere richiamata solo da altri sottoprogrammi nel package, non dall'esterno di quest'ultimo.
Per ulteriori informazioni sull'istruzione SELECT INTO, vedere anche: Oracle Database PL/SQL Language Reference
Esempio 5-2 Assegnazione dei valori delle tabelle alle variabili 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;
Esempio 5-3 Inserimento di una riga di tabella con valori da un'altra tabella
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;