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

VARIABILI BIND PL/SQL per il calcolo del volume del prisma rettangolare

Come indicato in la risposta alla tua domanda precedente , e nel commento di APC, le variabili bind non ti danno molto qui, ma sembra essere un esercizio, quindi... Il codice che hai mostra i valori OK con dbms_output . Per utilizzare PRINT invece, non puoi dichiarare d_volume nel blocco PL/SQL in quanto sarà fuori dall'ambito quando esci dal blocco, quindi devi renderlo una variable anche:

VARIABLE d_length NUMBER;
VARIABLE d_height NUMBER;
VARIABLE d_width NUMBER;
VARIABLE d_volume NUMBER;

BEGIN
    :d_length := &q_length;
    :d_height := &q_height;
    :d_width := &q_width;

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

print d_length
print d_height
print d_width
print d_volume

Che in SQL*Plus, con set verify off per rimuovere un po' di cruft, dà:

Enter value for q_length: 3
Enter value for q_height: 4
Enter value for q_width: 5

PL/SQL procedure successfully completed.


  D_LENGTH
----------
         3


  D_HEIGHT
----------
         4


   D_WIDTH
----------
         5


  D_VOLUME
----------
        60

SQL>

Curiosamente questo non funziona in SQL Developer (3.1.07 o 3.2.20); la riga :d_volume := :d_length * :d_height * :d_width; non assegna un valore come previsto, quindi viene segnalato come null. Puoi fare select :d_length * :d_height * :d_width into :d_volume from dual; invece, il che ha un senso in quanto sono "segnaposto nelle istruzioni SQL". Sembra che tu non possa ancora fare riferimento a :d_volume all'interno del blocco (cioè viene segnalato come null se si dbms_output it), ma è mostrato da print .

BEGIN
    :d_length := &q_length;
    :d_height := &q_height;
    :d_width := &q_width;

    select :d_length * :d_height * :d_width into :d_volume from dual;
    dbms_output.put_line('d_volume inside the block: ' || :d_volume);
END;
/

anonymous block completed
d_volume inside the block: 

D_LENGTH
-
3

D_HEIGHT
-
4

D_WIDTH
-
5

D_VOLUME
--
60

È interessante notare che dbms_output.put_line(':d_volume'); mostra qualcosa come :ZSqlDevUnIq8 nello sviluppatore SQL; in SQL*Plus mostra :d_volume .