Vázat proměnné a substituční proměnné jsou různé věci, takže formulace problému je zavádějící. A to je pouze verze SQL*Plus vazebných proměnných; může mít mírně odlišný (nebo alespoň méně zřejmý) význam než analyzátor.
V podstatě si pletete proměnné PL/SQL se substitučními proměnnými SQL*Plus. Když odkazujete na &d_length
definujete substituční proměnnou a uživatel bude v tomto okamžiku vyzván k zadání její hodnoty. Ale je zcela nezávislý na d_length
v PL/SQL DECLARE
blokovat.
Můžete se podívat na AKCEPTOVAT
příkaz pro úhledný způsob, jak získat hodnoty od uživatele, než začnete blokovat, ale můžete to udělat i takto:
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;
/
Nejste si jisti, co chcete, aby se zobrazil poslední řádek výstupu; liší se to od tří již zobrazených rozměrů?
Můžete to také udělat s proměnnými vazby tak, že je definujete pomocí VARIABILNÍ
příkaz
:
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;
/
Všimněte si, že d_length
, d_height
a d_width
mají v této verzi předponu dvojtečka, protože se jedná o proměnné vazby. Ale d_volume
není proto, že je stále deklarován v bloku PL/SQL. A skutečné hodnoty jsou stále získávány od uživatele jako substituční proměnné. To je však trochu zamotané; jejich vytvoření vazby proměnných zde ve skutečnosti nic nepřidává.