Както е отбелязано в отговорът на предишния ви въпрос
, и в коментара на APC променливите за свързване не ви дават много тук, но изглежда е упражнение, така че... Кодът, който имате, показва стойностите OK с dbms_output
. За да използвате PRINT
вместо това не можете да декларирате d_volume
в блока PL/SQL, тъй като ще бъде извън обхвата, когато излезете от блока, така че трябва да го направите variable
както и:
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
Което в SQL*Plus, с set verify off
за премахване на някои глупости, дава:
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>
Любопитно е, че това не работи съвсем в SQL Developer (3.1.07 или 3.2.20); редът :d_volume := :d_length * :d_height * :d_width;
не присвоява стойност според очакванията, така че се отчита като нула. Можете да направите select :d_length * :d_height * :d_width into :d_volume from dual;
вместо това, което има известен смисъл, тъй като те са „заместители в SQL изрази“. Изглежда, че все още не можете да посочите :d_volume
в рамките на блока (т.е. докладва се като нула, ако dbms_output
it), но се показва от 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
Интересното е, че dbms_output.put_line(':d_volume');
показва нещо като :ZSqlDevUnIq8
в SQL Developer; в SQL*Plus показва :d_volume
.