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

PL/SQL BIND VARIABLER til rektangulær prismevolumenberegning

Som nævnt på svaret på dit tidligere spørgsmål , og i APC's kommentar giver bindevariabler dig ikke meget her, men det ser ud til at være en øvelse, så... Den kode du har viser værdierne OK med dbms_output . Sådan bruger du PRINT i stedet kan du ikke erklære d_volume i PL/SQL-blokken, da den vil være uden for rækkevidde, når du forlader blokken, så du skal gøre det til en variable også:

VARIABLE d_length NUMBER;
VARIABLE d_height NUMBER;
VARIABLE d_width NUMBER;
VARIABLE d_volume NUMBER;

BEGIN
    :d_length := &q_length;
    :d_height := &q_height;
    :d_width := &q_width;

    :d_volume := :d_length * :d_height * :d_width;
END;
/

print d_length
print d_height
print d_width
print d_volume

Hvilket i SQL*Plus, med set verify off for at fjerne noget cruft, giver:

Enter value for q_length: 3
Enter value for q_height: 4
Enter value for q_width: 5

PL/SQL procedure successfully completed.


  D_LENGTH
----------
         3


  D_HEIGHT
----------
         4


   D_WIDTH
----------
         5


  D_VOLUME
----------
        60

SQL>

Mærkeligt nok virker det ikke helt i SQL Developer (3.1.07 eller 3.2.20); linjen :d_volume := :d_length * :d_height * :d_width; tildeler ikke en værdi som forventet, så den rapporteres som null. Du kan select :d_length * :d_height * :d_width into :d_volume from dual; i stedet, hvilket giver en vis mening, da de er 'pladsholdere i SQL-sætninger'. Det ser ud til, at du stadig ikke kan henvise til :d_volume inden for blokken (dvs. den rapporteres som null, hvis du dbms_output det), men det vises med print .

BEGIN
    :d_length := &q_length;
    :d_height := &q_height;
    :d_width := &q_width;

    select :d_length * :d_height * :d_width into :d_volume from dual;
    dbms_output.put_line('d_volume inside the block: ' || :d_volume);
END;
/

anonymous block completed
d_volume inside the block: 

D_LENGTH
-
3

D_HEIGHT
-
4

D_WIDTH
-
5

D_VOLUME
--
60

Interessant nok, dbms_output.put_line(':d_volume'); viser noget som :ZSqlDevUnIq8 i SQL-udvikler; i SQL*Plus viser den :d_volume .




  1. Højere kardinalitetskolonne først i et indeks, når det involverer et interval?

  2. Eclipse/MySQL integration plugins?

  3. ÆNDRINGSTABEL på afhængig kolonne

  4. Upsert i Postgres ved hjælp af node.js