Bind variabler og substitutionsvariabler er forskellige ting, så problemformuleringen er misvisende. Og det er kun SQL*Plus-versionen af bindevariabler; det kan have en lidt anderledes (eller i det mindste mindre indlysende) betydning for parseren.
Grundlæggende forveksler du PL/SQL-variabler med SQL*Plus-substitutionsvariabler. Når du henviser til &d_length
du definerer en substitutionsvariabel, og brugeren vil blive bedt om dens værdi på det tidspunkt. Men den er fuldstændig uafhængig af d_length
i PL/SQL DECLARE
blokere.
Du kan se på ACCEPTERE
kommando for en pæn måde at få værdier fra brugeren, før du begynder at blokere, men du kan også gøre det sådan her:
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;
/
Ikke sikker på, hvad du vil have den sidste linje af output til at vise; er det anderledes end de tre dimensioner, der allerede er vist?
Du kan også gøre det med bindevariabler ved at definere 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;
/
Bemærk, at d_length
, d_height
og d_width
er præfikset med kolon i denne version, fordi det er bindevariabler. Men d_volume
er ikke fordi det stadig er deklareret i PL/SQL-blokken. Og de faktiske værdier bliver stadig hentet fra brugeren som substitutionsvariable. Dette er dog lidt indviklet; at gøre dem til at binde variabler er ikke at tilføje noget her.