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.

  1. Nel frame Connessioni espandere hr_conn.

  2. Nella lista dei tipi di oggetto schema espandere Pacchetti.

  3. Nell'elenco dei pacchetti espandere EMP_EVAL.

  4. Nell'elenco delle opzioni, fare clic con il pulsante destro del mouse su Corpo EMP_EVAL.

    Viene visualizzata una lista di scelte.

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

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

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:

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,

  1. Nel frame Connessioni espandere hr_conn.

  2. Nella lista dei tipi di oggetto schema espandere Pacchetti.

  3. Nell'elenco dei pacchetti espandere EMP_EVAL.

  4. Nell'elenco delle opzioni, fare clic con il pulsante destro del mouse su Corpo EMP_EVAL.

  5. 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;
    
  6. 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;
    
  7. fare clic con il pulsante destro del mouse su EMP_EVAL.

  8. 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;
    
  9. 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)
    
  10. fare clic con il pulsante destro del mouse su EMP_EVAL.

  11. Nell'elenco di opzioni, selezionare Compila.

  12. Fare clic con un pulsante destro del mouse su Corpo EMP_EVAL.

  13. Nell'elenco di opzioni, selezionare Compila.

Assegnazione di valori alle variabili

È possibile assegnare un valore a una variabile mediante i metodi descritti di seguito:

Vedere anche:

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:

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;