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

VARIABLES DE ENLACE PL/SQL para cálculo de volumen de prisma rectangular

Como se indica en la respuesta a su pregunta anterior , y en el comentario de APC, las variables de vinculación no le brindan mucho aquí, pero parece ser un ejercicio, entonces ... El código que tiene muestra los valores OK con dbms_output . Para usar PRINT en cambio, no puede declarar d_volume en el bloque PL/SQL, ya que estará fuera del alcance cuando salga del bloque, por lo que debe convertirlo en una variable también:

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 en SQL*Plus, con set verify off para quitar algo de cruft, da:

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, eso no funciona del todo en SQL Developer (3.1.07 o 3.2.20); la línea :d_volume := :d_length * :d_height * :d_width; no asigna un valor como se esperaba, por lo que se notifica como nulo. Puede hacer select :d_length * :d_height * :d_width into :d_volume from dual; en cambio, lo que tiene sentido ya que son 'marcadores de posición en declaraciones SQL'. Parece que todavía no puedes hacer referencia a :d_volume dentro del bloque (es decir, se notifica como nulo si dbms_output it), pero se muestra mediante 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'); muestra algo como :ZSqlDevUnIq8 en Desarrollador SQL; en SQL*Plus muestra :d_volume .