Pertimbangkan cuplikan C#:
. iniint v_empno = 7369;
string v_ename;
OracleCommand cmd = con.CreateCommand();
cmd.Parameters.Add("paramEmpno", OracleDbType.Decimal, v_empno, ParameterDirection.Input);
cmd.CommandText = "select e.ename from scott.emp e where e.empno = :1";
v_ename = cmd.ExecuteScalar().ToString();
v_empno
dan v_ename
adalah variabel tuan rumah. Di sini Anda secara eksplisit membuat variabel bind Anda untuk digunakan sebagai :1
dalam pernyataan Anda.
Pertimbangkan cuplikan PL/SQL ini:
declare
v_empno number := 7369;
v_ename varchar2(10);
begin
select e.ename
into v_ename
from scott.emp e
where e.empno = v_empno;
dbms_output.put_line(v_ename);
end;
/
Sekali lagi variabel yang dideklarasikan v_empno
dan v_ename
dapat dianggap sebagai variabel host, tetapi ketika digunakan dalam SQL statis dalam kode PL/SQL, variabel tersebut secara otomatis diubah menjadi variabel bind oleh kompiler/mesin PL/SQL - Anda tidak perlu membuat variabel bind secara manual seperti di C# contoh. Jika Anda memeriksa SQL yang sebenarnya dieksekusi oleh PL/SQL ini, akan terlihat seperti ini:
select e.ename
from scott.emp e
where e.empno = :B1
Itu adalah compiler PL/SQL yang secara otomatis telah membuat :B1
ikat variabel untuk v_empno
. Anda variabel PL/SQL. Dan itulah maksud Tom Kyte bahwa Anda tidak dapat benar-benar membuat perbedaan yang tepat antara variabel host dan variabel bind di PL/SQL. Saat Anda menulis PL/SQL, variabelnya adalah variabel host saat digunakan dalam kode PL/SQL dan pada saat yang sama menjadi variabel pengikat saat digunakan dalam kode SQL yang disematkan. Anda tidak perlu membuat perbedaan dalam PL/SQL, kompiler akan menanganinya untuk Anda.