Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Lernen von Bind-Variablen in PL/SQL zusammen mit Berechnungseingabe und -ausgabe DBMS_OUTPUT.PUT_LINE

Variablen binden und Substitutionsvariablen sind verschiedene Dinge, daher ist die Problemformulierung irreführend. Und das ist nur die SQL*Plus-Version von Bind-Variablen; es kann für den Parser eine etwas andere (oder zumindest weniger offensichtliche) Bedeutung haben.

Im Wesentlichen verwechseln Sie PL/SQL-Variablen mit SQL*Plus-Substitutionsvariablen. Wenn Sie auf &d_length verweisen Sie definieren eine Substitutionsvariable, und der Benutzer wird an diesem Punkt zur Eingabe ihres Werts aufgefordert. Aber es ist völlig unabhängig von der d_length in PL/SQL DECLARE blockieren.

Sie können sich den AKZEPTIEREN Befehl für eine nette Möglichkeit, Werte vom Benutzer zu erhalten, bevor Sie mit dem Blockieren beginnen, aber Sie können es auch so machen:

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

Sie sind sich nicht sicher, was die letzte Zeile der Ausgabe anzeigen soll; Unterscheidet sich das von den bereits gezeigten drei Dimensionen?

Sie können dies auch mit Bind-Variablen tun, indem Sie sie mit VARIABLE Befehl :

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

Beachten Sie, dass d_length , d_height und d_width wird in dieser Version ein Doppelpunkt vorangestellt, da es sich um Bind-Variablen handelt. Aber d_volume nicht, weil das noch im PL/SQL-Block deklariert ist. Und die tatsächlichen Werte werden immer noch vom Benutzer als Substitutionsvariablen abgerufen. Dies ist jedoch etwas verworren; sie dazu zu bringen, Variablen zu binden, fügt hier nicht wirklich etwas hinzu.