Rozważ ten fragment C#:
int 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
i v_ename
są zmiennymi hosta. Tutaj jawnie tworzysz zmienną bind do użycia jako :1
w swoim oświadczeniu.
Rozważ ten fragment PL/SQL:
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;
/
Ponownie zadeklarowane zmienne v_empno
i v_ename
można uznać za zmienne hosta, ale gdy są one używane w statycznym SQL w kodzie PL/SQL, są automatycznie przekształcane w zmienne wiązania przez kompilator/silnik PL/SQL - nie trzeba ręcznie tworzyć zmiennej wiązania, jak w Przykład C#. Jeśli przyjrzysz się SQL, który jest faktycznie wykonywany przez ten fragment PL/SQL, będzie on wyglądał mniej więcej tak:
select e.ename
from scott.emp e
where e.empno = :B1
To jest kompilator PL/SQL, który automatycznie utworzył :B1
powiąż zmienną dla twojego v_empno
Zmienna PL/SQL. I to właśnie Tom Kyte ma na myśli, że tak naprawdę nie można właściwie rozróżnić między zmienną hosta a zmienną powiązaną w PL/SQL. Podczas pisania w języku PL/SQL zmienne są zmiennymi hosta, gdy są używane w kodzie PL/SQL, a jednocześnie są zmiennymi wiążącymi, gdy są używane w kodzie osadzonego SQL. Nie musisz robić rozróżnienia w PL/SQL, kompilator zadba o to za Ciebie.