Powiąż zmienne i zmienne podstawienia to różne rzeczy, więc sformułowanie problemu jest mylące. A to tylko wersja SQL*Plus zmiennych wiązania; może mieć nieco inne (lub przynajmniej mniej oczywiste) znaczenie dla parsera.
Zasadniczo mylisz zmienne PL/SQL ze zmiennymi podstawienia SQL*Plus. Kiedy odwołujesz się do &d_length
definiujesz zmienną podstawienia, a użytkownik zostanie w tym momencie poproszony o podanie jej wartości. Ale jest całkowicie niezależny od d_length
w PL/SQL DECLARE
blokować.
Możesz spojrzeć na AKCEPTUJ
polecenie, aby w zgrabny sposób uzyskać wartości od użytkownika przed rozpoczęciem blokowania, ale możesz to zrobić również w ten sposób:
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;
/
Nie jestem pewien, co ma pokazać ostatnia linia danych wyjściowych; czy to różni się od trzech już pokazanych wymiarów?
Możesz to również zrobić za pomocą zmiennych wiązania, definiując je za pomocą ZMIENNA
polecenie
:
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;
/
Zauważ, że d_length
, d_wysokość
i d_width
w tej wersji są poprzedzone dwukropkiem, ponieważ są to zmienne wiążące. Ale d_volume
nie dlatego, że jest to nadal zadeklarowane w bloku PL/SQL. Rzeczywiste wartości są nadal pobierane od użytkownika jako zmienne zastępcze. Jest to jednak nieco zawiłe; łączenie ich ze zmiennymi tak naprawdę niczego tutaj nie dodaje.