Zoals vermeld op het antwoord op uw vorige vraag
, en in de opmerking van APC geven bindvariabelen je hier niet veel, maar het lijkt een oefening te zijn, dus... De code die je hebt geeft de waarden OK weer met dbms_output
. PRINT
gebruiken
in plaats daarvan kunt u d_volume
. niet declareren in het PL/SQL-blok omdat het buiten het bereik valt wanneer je het blok verlaat, dus je moet dat een variable
maken ook:
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
Die in SQL*Plus, met set verify off
om wat rommel te verwijderen, geeft:
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>
Vreemd genoeg werkt dat niet helemaal in SQL Developer (3.1.07 of 3.2.20); de regel :d_volume := :d_length * :d_height * :d_width;
wijst geen waarde toe zoals verwacht, dus het wordt gerapporteerd als null. Je kunt select :d_length * :d_height * :d_width into :d_volume from dual;
in plaats daarvan, wat logisch is omdat het 'plaatsaanduidingen in SQL-instructies' zijn. Het lijkt erop dat je dan nog steeds niet kunt verwijzen naar :d_volume
binnen het blok (d.w.z. het wordt gerapporteerd als null als u dbms_output
it), maar het wordt weergegeven door 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 is dat dbms_output.put_line(':d_volume');
laat iets zien als :ZSqlDevUnIq8
in SQL-ontwikkelaar; in SQL*Plus toont het :d_volume
.