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

Apprentissage des variables de liaison en PL/SQL avec l'entrée et la sortie de calcul DBMS_OUTPUT.PUT_LINE

Variables de liaison et variables de substitution sont des choses différentes, donc la formulation du problème est trompeuse. Et ce n'est que la version SQL*Plus des variables de liaison; il peut avoir une signification légèrement différente (ou du moins moins évidente) pour l'analyseur.

Essentiellement, vous confondez les variables PL/SQL avec les variables de substitution SQL*Plus. Lorsque vous faites référence à &d_length vous définissez une variable de substitution et l'utilisateur sera invité à entrer sa valeur à ce stade. Mais il est complètement indépendant de la d_length dans le PL/SQL DECLARE bloquer.

Vous pouvez consulter le ACCEPT commande pour un moyen pratique d'obtenir des valeurs de l'utilisateur avant de commencer à bloquer, mais vous pouvez également le faire comme ceci :

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;
/

Vous ne savez pas ce que vous voulez que la dernière ligne de sortie affiche ; est-ce différent des trois dimensions déjà affichées ?

Vous pouvez également le faire avec des variables de liaison en les définissant avec le VARIABLE commande :

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;
/

Notez que d_length , d_height et d_width sont préfixés par deux-points dans cette version, car ce sont des variables de liaison. Mais d_volume n'est pas parce que cela est toujours déclaré dans le bloc PL/SQL. Et les valeurs réelles sont toujours récupérées par l'utilisateur en tant que variables de substitution. C'est un peu compliqué cependant; en faire des variables de liaison n'ajoute vraiment rien ici.