Помислете за този фрагмент от 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
и v_ename
са хост променливи. Тук изрично създавате вашата променлива за свързване за използване като :1
във вашето изявление.
Помислете за този фрагмент от 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;
/
Отново декларираните променливи v_empno
и v_ename
могат да се считат за хост променливи, но когато се използват в статичен SQL в рамките на PL/SQL кода, те автоматично се превръщат в обвързващи променливи от PL/SQL компилатора/двигателя - не е нужно ръчно да създавате вашата обвързваща променлива, както в C# пример. Ако разгледате SQL, който действително се изпълнява от тази част от PL/SQL, той ще изглежда по следния начин:
select e.ename
from scott.emp e
where e.empno = :B1
Това е PL/SQL компилаторът, който автоматично е създал :B1
свързваща променлива за вашия v_empno
PL/SQL променлива. И това е, което Том Кайт има предвид, че не можете наистина да направите правилно разграничение между хост променлива и свързваща променлива в PL/SQL. Когато пишете PL/SQL, променливите са хост променливи, когато се използват в PL/SQL код и в същото време те са свързващи променливи, когато се използват във вградения SQL код. Не е необходимо да правите разлика в PL/SQL, компилаторът се грижи за това вместо вас.