Bindningsvariabler och ersättningsvariabler är olika saker, så problemformuleringen är missvisande. Och det är bara SQL*Plus-versionen av bindningsvariabler; det kan ha en något annorlunda (eller åtminstone mindre uppenbar) betydelse för parsern.
I huvudsak blandar du ihop PL/SQL-variabler med SQL*Plus-substitutionsvariabler. När du refererar till &d_length
du definierar en substitutionsvariabel och användaren kommer att bli tillfrågad om dess värde vid den tidpunkten. Men det är helt oberoende av d_length
i PL/SQL DECLARE
blockera.
Du kan titta på ACCEPTERA
kommando för ett snyggt sätt att hämta värden från användaren innan du börjar blockera, men du kan göra det så här också:
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;
/
Osäker på vad du vill att den sista raden ska visa; skiljer det sig från de tre dimensionerna som redan visas?
Du kan också göra det med bindningsvariabler genom att definiera dem med VARIABEL
kommando
:
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;
/
Lägg märke till att d_length
, d_height
och d_width
har prefixet kolon i den här versionen, eftersom de är bindningsvariabler. Men d_volume
är inte för att det fortfarande deklareras i PL/SQL-blocket. Och de faktiska värdena hämtas fortfarande från användaren som substitutionsvariabler. Detta är dock lite invecklat; Att göra dem bindande variabler är egentligen inte att lägga till något här.