sql >> Base de Datos >  >> RDS >> Oracle

Aprendizaje de variables de vinculación en PL/SQL junto con entrada y salida de cálculo DBMS_OUTPUT.PUT_LINE

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.