Свързване на променливи и променливи за заместване са различни неща, така че формулировката на проблема е подвеждаща. И това е само SQL*Plus версията на свързващите променливи; може да има малко по-различно (или поне по-малко очевидно) значение за анализатора.
По същество вие обърквате PL/SQL променливи със заместващи променливи SQL*Plus. Когато цитирате &d_length
вие дефинирате заместваща променлива и потребителят ще бъде подканен за нейната стойност в този момент. Но той е напълно независим от d_length
в PL/SQL DECLARE
блокирай.
Можете да погледнете ACCEPTкод>
команда за чист начин за получаване на стойности от потребителя, преди да започнете да блокирате, но можете да го направите и по следния начин:
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;
/
Не сте сигурни какво искате да показва последният ред на изхода; това различно ли е от вече показаните три измерения?
Можете също да го направите с променливи за свързване, като ги дефинирате с