sql >> Database teknologi >  >> RDS >> Oracle

Læring af bindingsvariabler i PL/SQL sammen med beregningsinput og -output DBMS_OUTPUT.PUT_LINE

Bind variabler og substitutionsvariabler er forskellige ting, så problemformuleringen er misvisende. Og det er kun SQL*Plus-versionen af ​​bindevariabler; det kan have en lidt anderledes (eller i det mindste mindre indlysende) betydning for parseren.

Grundlæggende forveksler du PL/SQL-variabler med SQL*Plus-substitutionsvariabler. Når du henviser til &d_length du definerer en substitutionsvariabel, og brugeren vil blive bedt om dens værdi på det tidspunkt. Men den er fuldstændig uafhængig af d_length i PL/SQL DECLARE blokere.

Du kan se på ACCEPTERE kommando for en pæn måde at få værdier fra brugeren, før du begynder at blokere, men du kan også gøre det sådan her:

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

Ikke sikker på, hvad du vil have den sidste linje af output til at vise; er det anderledes end de tre dimensioner, der allerede er vist?

Du kan også gøre det med bindevariabler ved at definere 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;
/

Bemærk, at d_length , d_height og d_width er præfikset med kolon i denne version, fordi det er bindevariabler. Men d_volume er ikke fordi det stadig er deklareret i PL/SQL-blokken. Og de faktiske værdier bliver stadig hentet fra brugeren som substitutionsvariable. Dette er dog lidt indviklet; at gøre dem til at binde variabler er ikke at tilføje noget her.




  1. Hvordan bruger jeg gruppe efter med tre kolonner med data?

  2. Brugerdefinerede dato-/tidsformatstrenge, der understøttes af FORMAT() i SQL Server

  3. Formater den samlede værdi til en valuta med 2 decimaler

  4. Brug af unaccent med SearchVector og SearchQuery i Django