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.