Vincular variables y variables de sustitución son cosas diferentes, por lo que la redacción del problema es engañosa. Y esa es solo la versión SQL*Plus de las variables de vinculación; puede tener un significado ligeramente diferente (o al menos menos obvio) para el analizador.
Básicamente, está confundiendo las variables PL/SQL con las variables de sustitución de SQL*Plus. Cuando haces referencia a &d_length
está definiendo una variable de sustitución y se le solicitará al usuario su valor en ese punto. Pero es completamente independiente del d_length
en PL/SQL DECLARE
bloquear.
Puede consultar el ACCEPT
Comando para una forma ordenada de obtener valores del usuario antes de comenzar a bloquear, pero también puede hacerlo así:
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;
/
No estoy seguro de lo que quiere que muestre la última línea de salida; ¿Es eso diferente de las tres dimensiones que ya se muestran?
También puede hacerlo con variables de vinculación definiéndolas con VARIABLE
comando
:
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;
/
Note que d_length
, d_height
y d_width
tienen el prefijo de dos puntos en esta versión, porque son variables de vinculación. Pero d_volume
no es porque eso todavía está declarado en el bloque PL/SQL. Y los valores reales aún se recuperan del usuario como variables de sustitución. Sin embargo, esto es un poco complicado; hacer que vinculen variables no agrega nada aquí realmente.