sql >> Databasteknik >  >> RDS >> Oracle

PL/SQL BIND VARIABLER för rektangulär prisma volymberäkning

Som noterat på svaret på din tidigare fråga , och i APC:s kommentar ger bindningsvariabler dig inte mycket här, men det verkar vara en övning, så... Koden du har visar värdena OK med dbms_output . För att använda PRINT istället kan du inte deklarera d_volume i PL/SQL-blocket eftersom det kommer att vara utanför omfattningen när du lämnar blocket, så du måste göra det till en variable likaså:

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

Vilket i SQL*Plus, med set verify off för att ta bort en del cruft, ger:

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ärkligt nog fungerar det inte riktigt i SQL Developer (3.1.07 eller 3.2.20); raden :d_volume := :d_length * :d_height * :d_width; tilldelar inte ett värde som förväntat, så det rapporteras som null. Du kan göra select :d_length * :d_height * :d_width into :d_volume from dual; istället, vilket är vettigt eftersom de är "platshållare i SQL-satser". Det verkar som att du fortfarande inte kan referera till :d_volume inom blocket (dvs. det rapporteras som null om du dbms_output det), men det visas 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

Intressant nog, dbms_output.put_line(':d_volume'); visar något som :ZSqlDevUnIq8 i SQL-utvecklare; i SQL*Plus den visar :d_volume .




  1. Spring JDBC-mall- Hur man hämtar flera resultat med flera parametrar med en enda fråga

  2. Hur implementerar man LIMIT med SQL Server?

  3. Min spring+hibernate-app stänger inte jdbc-anslutningar

  4. Installationen av Oracle Developer Tools 12 misslyckas och hävdar att jag har Windows XP. Jag har Windows 7