Conforme observado na resposta à sua pergunta anterior , e no comentário da APC, as variáveis de ligação não estão dando muito aqui, mas parece ser um exercício, então... O código que você tem exibe os valores OK com
dbms_output
. Para usar PRINT
em vez disso, você não pode declarar d_volume
no bloco PL/SQL, pois ele estará fora do escopo quando você sair do bloco, então você precisa tornar isso uma variable
também:VARIABLE d_length NUMBER;
VARIABLE d_height NUMBER;
VARIABLE d_width NUMBER;
VARIABLE d_volume NUMBER;
BEGIN
:d_length := &q_length;
:d_height := &q_height;
:d_width := &q_width;
:d_volume := :d_length * :d_height * :d_width;
END;
/
print d_length
print d_height
print d_width
print d_volume
Que no SQL*Plus, com
set verify off
para remover alguma sujeira, dá:Enter value for q_length: 3
Enter value for q_height: 4
Enter value for q_width: 5
PL/SQL procedure successfully completed.
D_LENGTH
----------
3
D_HEIGHT
----------
4
D_WIDTH
----------
5
D_VOLUME
----------
60
SQL>
Curiosamente isso não funciona no SQL Developer (3.1.07 ou 3.2.20); a linha
:d_volume := :d_length * :d_height * :d_width;
não atribui um valor conforme o esperado, portanto, é relatado como nulo. Você pode fazer select :d_length * :d_height * :d_width into :d_volume from dual;
em vez disso, o que faz algum sentido, pois são 'espaços reservados em instruções SQL'. Parece que você ainda não pode fazer referência a :d_volume
dentro do bloco (ou seja, é relatado como nulo se você dbms_output
it), mas é mostrado por print
. BEGIN
:d_length := &q_length;
:d_height := &q_height;
:d_width := &q_width;
select :d_length * :d_height * :d_width into :d_volume from dual;
dbms_output.put_line('d_volume inside the block: ' || :d_volume);
END;
/
anonymous block completed
d_volume inside the block:
D_LENGTH
-
3
D_HEIGHT
-
4
D_WIDTH
-
5
D_VOLUME
--
60
Curiosamente,
dbms_output.put_line(':d_volume');
mostra algo como :ZSqlDevUnIq8
em SQL Developer; no SQL*Plus mostra :d_volume
.