Variáveis de vinculação e variáveis de substituição são coisas diferentes, então a formulação do problema é enganosa. E essa é apenas a versão SQL*Plus das variáveis de ligação; ele pode ter um significado ligeiramente diferente (ou pelo menos menos óbvio) para o analisador.
Essencialmente, você está confundindo variáveis PL/SQL com variáveis de substituição SQL*Plus. Quando você faz referência a
&d_length
você está definindo uma variável de substituição, e o usuário será solicitado a informar seu valor nesse ponto. Mas é completamente independente do d_length
no PL/SQL DECLARE
quadra. Você pode consultar o
ACEITAR
command para uma maneira legal de obter valores do usuário antes de começar a bloquear, mas você também pode fazer assim: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;
/
Não tenho certeza do que você deseja que a última linha de saída mostre; isso é diferente das três dimensões já mostradas?
Você também pode fazer isso com variáveis de vinculação definindo-as com o
VARIÁVEL
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;
/
Observe que
d_length
, d_altura
e d_width
são prefixados com dois pontos nesta versão, porque essas são variáveis de ligação. Mas d_volume
não é porque isso ainda está declarado no bloco PL/SQL. E os valores reais ainda estão sendo recuperados do usuário como variáveis de substituição. Isso é um pouco complicado embora; fazê-los vincular variáveis não está adicionando nada aqui realmente.