Oracle
 sql >> Datenbank >  >> RDS >> Oracle

PL/SQL BIND VARIABLES für Rectangular Prism Volume Calculation

Wie in der Antwort auf Ihre vorherige Frage erwähnt , und im Kommentar von APC geben Bind-Variablen hier nicht viel her, aber es scheint eine Übung zu sein, also ... Der Code, den Sie haben, zeigt die Werte OK mit dbms_output an . Verwenden Sie PRINT stattdessen können Sie d_volume nicht deklarieren im PL/SQL-Block, da es außerhalb des Gültigkeitsbereichs liegt, wenn Sie den Block verlassen, also müssen Sie daraus eine variable machen auch:

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

Was in SQL*Plus mit set verify off Um etwas Cruft zu entfernen, gibt:

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>

Seltsamerweise funktioniert das in SQL Developer (3.1.07 oder 3.2.20) nicht ganz; die Zeile :d_volume := :d_length * :d_height * :d_width; weist nicht wie erwartet einen Wert zu, daher wird er als null gemeldet. Sie können select :d_length * :d_height * :d_width into :d_volume from dual; stattdessen, was Sinn macht, da es sich um "Platzhalter in SQL-Anweisungen" handelt. Es scheint, dass Sie dann immer noch nicht auf :d_volume verweisen können innerhalb des Blocks (d. h. es wird als null gemeldet, wenn Sie dbms_output it), wird aber durch print angezeigt .

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

Interessanterweise dbms_output.put_line(':d_volume'); zeigt so etwas wie :ZSqlDevUnIq8 im SQL-Entwickler; in SQL*Plus zeigt es :d_volume .