Variabel ikat dan variabel substitusi adalah hal yang berbeda, sehingga kata-kata masalah menyesatkan. Dan itu hanya versi SQL*Plus dari variabel bind; itu dapat memiliki arti yang sedikit berbeda (atau setidaknya kurang jelas) untuk pengurai.
Pada dasarnya Anda membingungkan variabel PL/SQL dengan variabel substitusi SQL*Plus. Saat Anda mereferensikan &d_length
Anda mendefinisikan variabel substitusi, dan pengguna akan dimintai nilainya pada saat itu. Tapi itu benar-benar independen dari d_length
di PL/SQL DECLARE
blokir.
Anda dapat melihat ACCEPT
perintah untuk cara yang rapi untuk mendapatkan nilai dari pengguna sebelum Anda mulai memblokir, tetapi Anda juga dapat melakukannya seperti ini:
SET SERVEROUTPUT ON
DECLARE
d_length NUMBER := &q_length;
d_height NUMBER := &q_height;
d_width NUMBER := &q_width;
d_volume NUMBER;
BEGIN
DBMS_OUTPUT.PUT_LINE('The length dimension is: ' || d_length);
DBMS_OUTPUT.PUT_LINE('The height dimension is: ' || d_height);
DBMS_OUTPUT.PUT_LINE('The width dimension is: ' || d_width);
d_volume := d_length * d_height * d_width;
DBMS_OUTPUT.PUT_LINE(
'The rectangular prism volume for the swimming pool is: '
|| d_volume);
DBMS_OUTPUT.PUT_LINE(
'The dimensions of the swimming pool are ' || '?');
END;
/
Tidak yakin apa yang Anda inginkan untuk ditampilkan pada baris keluaran terakhir; apakah itu berbeda dari tiga dimensi yang sudah ditampilkan?
Anda juga dapat melakukannya dengan variabel bind dengan mendefinisikannya dengan VARIABLE
perintah
:
SET SERVEROUTPUT ON
VARIABLE d_length NUMBER;
VARIABLE d_height NUMBER;
VARIABLE d_width NUMBER;
DECLARE
d_volume NUMBER;
BEGIN
:d_length := &q_length;
:d_height := &q_height;
:d_width := &q_width;
DBMS_OUTPUT.PUT_LINE('The length dimension is: ' || :d_length);
DBMS_OUTPUT.PUT_LINE('The height dimension is: ' || :d_height);
DBMS_OUTPUT.PUT_LINE('The width dimension is: ' || :d_width);
d_volume := :d_length * :d_height * :d_width;
DBMS_OUTPUT.PUT_LINE(
'The rectangular prism volume for the swimming pool is: '
|| d_volume);
DBMS_OUTPUT.PUT_LINE(
'The dimensions of the swimming pool are ' || '?');
END;
/
Perhatikan bahwa d_length
, d_height
dan d_width
diawali dengan titik dua dalam versi ini, karena itu adalah variabel pengikat. Tapi d_volume
bukan karena itu masih dideklarasikan di blok PL/SQL. Dan nilai aktual masih diambil dari pengguna sebagai variabel substitusi. Ini agak berbelit-belit; membuatnya mengikat variabel tidak benar-benar menambahkan apa pun di sini.