Jak wspomniano w odpowiedzi na Twoje poprzednie pytanie
, a w komentarzu APC zmienne bind nie dają tu wiele, ale wydaje się to być ćwiczeniem, więc... Kod, który masz wyświetla wartości OK za pomocą dbms_output
. Aby użyć PRINT
zamiast tego nie możesz zadeklarować d_volume
w bloku PL/SQL, ponieważ będzie poza zakresem po wyjściu z bloku, więc musisz ustawić go jako variable
a także:
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
Które w SQL*Plus, z set verify off
aby usunąć trochę cruft, daje:
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>
Co ciekawe, nie do końca działa to w SQL Developer (3.1.07 lub 3.2.20); wiersz :d_volume := :d_length * :d_height * :d_width;
nie przypisuje wartości zgodnie z oczekiwaniami, więc jest zgłaszana jako null. Możesz select :d_length * :d_height * :d_width into :d_volume from dual;
zamiast tego, co ma sens, ponieważ są one „wypełniaczami w instrukcjach SQL”. Wygląda na to, że nadal nie możesz odwołać się do :d_volume
wewnątrz bloku (tzn. jest zgłaszane jako null, jeśli dbms_output
to), ale jest to pokazane przez 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
Co ciekawe, dbms_output.put_line(':d_volume');
pokazuje coś w stylu :ZSqlDevUnIq8
w SQL Developer; w SQL*Plus pokazuje :d_volume
.