Zvažte tento úryvek 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
a v_ename
jsou hostitelské proměnné. Zde explicitně vytvoříte proměnnou vazby pro použití jako :1
ve vašem prohlášení.
Zvažte tento úryvek 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;
/
Opět deklarované proměnné v_empno
a v_ename
lze považovat za hostitelské proměnné, ale když jsou použity ve statickém SQL v rámci kódu PL/SQL, kompilátor/engine PL/SQL je automaticky převede na proměnné vazby - nemusíte ručně vytvářet proměnnou vazby jako v Příklad C#. Pokud prozkoumáte SQL, který je skutečně spouštěn touto částí PL/SQL, bude vypadat nějak takto:
select e.ename
from scott.emp e
where e.empno = :B1
To je kompilátor PL/SQL, který automaticky vytvořil :B1
proměnnou vazby pro váš v_empno
PL/SQL proměnná. A to je to, co Tom Kyte znamená, že v PL/SQL opravdu nemůžete správně rozlišovat mezi hostitelskou proměnnou a proměnnou vazby. Když píšete PL/SQL, proměnné jsou hostitelské proměnné, když se používají v kódu PL/SQL, a zároveň jsou to vazebné proměnné, když jsou použity ve vloženém kódu SQL. V PL/SQL nemusíte dělat rozdíly, kompilátor se o to postará za vás.