sql >> Databasteknik >  >> RDS >> Oracle

Att lära sig bindningsvariabler i PL/SQL tillsammans med beräkningsinmatning och -utgång DBMS_OUTPUT.PUT_LINE

Bindningsvariabler och ersättningsvariabler är olika saker, så problemformuleringen är missvisande. Och det är bara SQL*Plus-versionen av bindningsvariabler; det kan ha en något annorlunda (eller åtminstone mindre uppenbar) betydelse för parsern.

I huvudsak blandar du ihop PL/SQL-variabler med SQL*Plus-substitutionsvariabler. När du refererar till &d_length du definierar en substitutionsvariabel och användaren kommer att bli tillfrågad om dess värde vid den tidpunkten. Men det är helt oberoende av d_length i PL/SQL DECLARE blockera.

Du kan titta på ACCEPTERA kommando för ett snyggt sätt att hämta värden från användaren innan du börjar blockera, men du kan göra det så här också:

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

Osäker på vad du vill att den sista raden ska visa; skiljer det sig från de tre dimensionerna som redan visas?

Du kan också göra det med bindningsvariabler genom att definiera dem med VARIABEL kommando :

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

Lägg märke till att d_length , d_height och d_width har prefixet kolon i den här versionen, eftersom de är bindningsvariabler. Men d_volume är inte för att det fortfarande deklareras i PL/SQL-blocket. Och de faktiska värdena hämtas fortfarande från användaren som substitutionsvariabler. Detta är dock lite invecklat; Att göra dem bindande variabler är egentligen inte att lägga till något här.




  1. PDO/MYSQL förberedda uttalanden som inte undkommer tecken?

  2. Hur lagrar man datum med olika precisionsnivåer i postgres?

  3. En databasmodell för en onlineundersökning. Del 3

  4. Laravel:hur man får genomsnitt på kapslade hasMany relationer (hasManyThrough)