Oracle
 sql >> Base de données >  >> RDS >> Oracle

PL/SQL BIND VARIABLES pour le calcul du volume du prisme rectangulaire

Comme indiqué sur la réponse à votre question précédente , et dans le commentaire d'APC, les variables de liaison ne vous donnent pas grand-chose ici, mais cela semble être un exercice, donc... Le code que vous avez affiche les valeurs OK avec dbms_output . Pour utiliser PRINT à la place, vous ne pouvez pas déclarer d_volume dans le bloc PL/SQL car il sera hors de portée lorsque vous quitterez le bloc, vous devez donc en faire une variable aussi :

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

Qui dans SQL*Plus, avec set verify off pour enlever quelques crudités, donne :

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>

Curieusement, cela ne fonctionne pas tout à fait dans SQL Developer (3.1.07 ou 3.2.20); la ligne :d_volume := :d_length * :d_height * :d_width; n'attribue pas de valeur comme prévu, elle est donc signalée comme nulle. Vous pouvez faire select :d_length * :d_height * :d_width into :d_volume from dual; à la place, ce qui a du sens car ce sont des "espaces réservés dans les instructions SQL". Il semble que vous ne puissiez toujours pas référencer :d_volume dans le bloc (c'est-à-dire qu'il est signalé comme nul si vous dbms_output it), mais il est affiché par 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

Fait intéressant, dbms_output.put_line(':d_volume'); affiche quelque chose comme :ZSqlDevUnIq8 dans Développeur SQL ; dans SQL*Plus, il affiche :d_volume .