Overvej dette uddrag af 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
og v_ename
er værtsvariabler. Her opretter du eksplicit din bind-variabel til brug som :1
i din erklæring.
Overvej dette uddrag af 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;
/
Igen de erklærede variabler v_empno
og v_ename
kan betragtes som værtsvariabler, men når de bruges i statisk SQL inden for PL/SQL-koden, bliver de automatisk omdannet til bindevariabler af PL/SQL-kompileren/motoren - du behøver ikke manuelt at oprette din bind-variabel som i C# eksempel. Hvis du undersøger den SQL, der faktisk udføres af dette stykke PL/SQL, vil det se nogenlunde sådan ud:
select e.ename
from scott.emp e
where e.empno = :B1
Det er PL/SQL-kompileren, der automatisk har oprettet :B1
bind variabel for din v_empno
PL/SQL variabel. Og det er det, Tom Kyte mener, at man ikke rigtig kan skelne mellem værtsvariabel og bindevariabel i PL/SQL. Når du skriver PL/SQL, er variablerne værtsvariabler, når de bruges i PL/SQL-kode, og samtidig er de bindevariabler, når de bruges i den indlejrede SQL-kode. Du behøver ikke at skelne i PL/SQL, compileren tager sig af det for dig.