Bind variabelen en substitutievariabelen zijn verschillende dingen, dus de probleemstelling is misleidend. En dat is nog maar de SQL*Plus-versie van bindvariabelen; het kan een iets andere (of in ieder geval minder voor de hand liggende) betekenis hebben voor de parser.
In wezen verwar je PL/SQL-variabelen met SQL*Plus-substitutievariabelen. Wanneer u verwijst naar &d_length
u definieert een substitutievariabele en de gebruiker wordt op dat moment om zijn waarde gevraagd. Maar het is volledig onafhankelijk van de d_length
in de PL/SQL DECLARE
blok.
U kunt de ACCEPT
commando voor een nette manier om waarden van de gebruiker te krijgen voordat je begint met blokkeren, maar je kunt het ook als volgt doen:
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;
/
Weet u niet zeker wat u wilt dat de laatste regel van de uitvoer laat zien; is dat anders dan de drie dimensies die al zijn getoond?
Je kunt het ook doen met bindvariabelen door ze te definiëren met de VARIABLE
commando
:
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;
/
Merk op dat d_length
, d_height
en d_width
worden in deze versie voorafgegaan door een dubbele punt, omdat dit bindvariabelen zijn. Maar d_volume
is niet omdat dat nog steeds wordt gedeclareerd in het PL/SQL-blok. En de werkelijke waarden worden nog steeds van de gebruiker opgehaald als vervangingsvariabelen. Dit is echter een beetje ingewikkeld; variabelen laten binden voegt hier eigenlijk niets toe.