Variablen binden und Substitutionsvariablen sind verschiedene Dinge, daher ist die Problemformulierung irreführend. Und das ist nur die SQL*Plus-Version von Bind-Variablen; es kann für den Parser eine etwas andere (oder zumindest weniger offensichtliche) Bedeutung haben.
Im Wesentlichen verwechseln Sie PL/SQL-Variablen mit SQL*Plus-Substitutionsvariablen. Wenn Sie auf &d_length
verweisen Sie definieren eine Substitutionsvariable, und der Benutzer wird an diesem Punkt zur Eingabe ihres Werts aufgefordert. Aber es ist völlig unabhängig von der d_length
in PL/SQL DECLARE
blockieren.
Sie können sich den AKZEPTIEREN
Befehl für eine nette Möglichkeit, Werte vom Benutzer zu erhalten, bevor Sie mit dem Blockieren beginnen, aber Sie können es auch so machen:
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;
/
Sie sind sich nicht sicher, was die letzte Zeile der Ausgabe anzeigen soll; Unterscheidet sich das von den bereits gezeigten drei Dimensionen?
Sie können dies auch mit Bind-Variablen tun, indem Sie sie mit VARIABLE
Befehl
:
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;
/
Beachten Sie, dass d_length
, d_height
und d_width
wird in dieser Version ein Doppelpunkt vorangestellt, da es sich um Bind-Variablen handelt. Aber d_volume
nicht, weil das noch im PL/SQL-Block deklariert ist. Und die tatsächlichen Werte werden immer noch vom Benutzer als Substitutionsvariablen abgerufen. Dies ist jedoch etwas verworren; sie dazu zu bringen, Variablen zu binden, fügt hier nicht wirklich etwas hinzu.