Như đã lưu ý trên câu trả lời cho câu hỏi trước của bạn
và trong nhận xét của APC, các biến liên kết không mang lại cho bạn nhiều điều ở đây, nhưng nó có vẻ là một bài tập, vì vậy ... Đoạn mã bạn có hiển thị các giá trị OK với dbms_output
. Để sử dụng PRINT
thay vào đó, bạn không thể khai báo d_volume
trong khối PL / SQL vì nó sẽ nằm ngoài phạm vi khi bạn thoát khỏi khối, vì vậy bạn cần tạo biến variable
đó nữa:
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
Trong SQL * Plus, với set verify off
để loại bỏ một số điểm mấu chốt, hãy đưa ra:
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>
Thật kỳ lạ là điều đó không hoàn toàn hoạt động trong SQL Developer (3.1.07 hoặc 3.2.20); dòng :d_volume := :d_length * :d_height * :d_width;
không chỉ định một giá trị như mong đợi, vì vậy nó được báo cáo là null. Bạn có thể thực hiện select :d_length * :d_height * :d_width into :d_volume from dual;
thay vào đó, điều này có ý nghĩa vì chúng là 'trình giữ chỗ trong câu lệnh SQL'. Có vẻ như bạn vẫn không thể tham chiếu :d_volume
trong khối (tức là nó được báo cáo là null nếu bạn dbms_output
it), nhưng nó được hiển thị bằng 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
Thật thú vị, dbms_output.put_line(':d_volume');
hiển thị một cái gì đó như :ZSqlDevUnIq8
trong SQL Developer; trong SQL * Plus nó hiển thị :d_volume
.