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
.