Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

VARIÁVEIS BIND PL/SQL para cálculo de volume de prisma retangular


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 .