Oracle
 sql >> Database >  >> RDS >> Oracle

Apprendimento delle variabili di binding in PL/SQL insieme all'input e all'output di calcolo DBMS_OUTPUT.PUT_LINE

Collega variabili e variabili di sostituzione sono cose diverse, quindi la formulazione del problema è fuorviante. E questa è solo la versione SQL*Plus delle variabili bind; può avere un significato leggermente diverso (o almeno meno ovvio) per il parser.

In sostanza stai confondendo le variabili PL/SQL con le variabili di sostituzione SQL*Plus. Quando fai riferimento a &d_length si sta definendo una variabile di sostituzione e all'utente verrà richiesto il suo valore a quel punto. Ma è completamente indipendente da d_length nel PL/SQL DECLARE blocco.

Puoi guardare il ACCEPT comando per ottenere i valori dall'utente prima di iniziare a bloccare, ma puoi farlo anche in questo modo:

SET SERVEROUTPUT ON
DECLARE
    d_length    NUMBER := &q_length;
    d_height    NUMBER := &q_height;
    d_width     NUMBER := &q_width;
    d_volume    NUMBER;
BEGIN
    DBMS_OUTPUT.PUT_LINE('The length dimension is: ' || d_length);
    DBMS_OUTPUT.PUT_LINE('The height dimension is: ' || d_height);
    DBMS_OUTPUT.PUT_LINE('The width dimension is: ' || d_width);  

    d_volume := d_length * d_height * d_width;

    DBMS_OUTPUT.PUT_LINE(
        'The rectangular prism volume for the swimming pool is: ' 
           || d_volume);

   DBMS_OUTPUT.PUT_LINE(
       'The dimensions of the swimming pool are ' || '?');
END;
/

Non sono sicuro di cosa vuoi mostrare nell'ultima riga di output; è diverso dalle tre dimensioni già mostrate?

Puoi farlo anche con le variabili bind definendole con VARIABLE comando :

SET SERVEROUTPUT ON
VARIABLE d_length NUMBER;
VARIABLE d_height NUMBER;
VARIABLE d_width NUMBER;

DECLARE 
    d_volume    NUMBER;
BEGIN
    :d_length := &q_length;
    :d_height := &q_height;
    :d_width := &q_width;

    DBMS_OUTPUT.PUT_LINE('The length dimension is: ' || :d_length);
    DBMS_OUTPUT.PUT_LINE('The height dimension is: ' || :d_height);
    DBMS_OUTPUT.PUT_LINE('The width dimension is: ' || :d_width);  

    d_volume := :d_length * :d_height * :d_width;

    DBMS_OUTPUT.PUT_LINE(
        'The rectangular prism volume for the swimming pool is: ' 
           || d_volume);

   DBMS_OUTPUT.PUT_LINE(
       'The dimensions of the swimming pool are ' || '?');
END;
/

Nota che d_length , d_height e d_width sono preceduti da due punti in questa versione, perché sono variabili di collegamento. Ma d_volume non è perché è ancora dichiarato nel blocco PL/SQL. E i valori effettivi vengono ancora recuperati dall'utente come variabili di sostituzione. Questo è un po' contorto però; farli associare variabili non significa aggiungere nulla qui in realtà.