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

Aprendendo variáveis ​​de vinculação em PL/SQL junto com entrada e saída de cálculo DBMS_OUTPUT.PUT_LINE


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.