Overweeg dit fragment van 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
en v_ename
zijn hostvariabelen. Hier maakt u expliciet uw bindvariabele aan voor gebruik als :1
in uw verklaring.
Overweeg dit fragment van 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;
/
Nogmaals de gedeclareerde variabelen v_empno
en v_ename
kunnen worden beschouwd als hostvariabelen, maar wanneer ze worden gebruikt in statische SQL binnen de PL/SQL-code, worden ze automatisch omgezet in bindvariabelen door de PL/SQL-compiler/engine - u hoeft uw bindvariabele niet handmatig te maken zoals in de C# voorbeeld. Als je de SQL bekijkt die daadwerkelijk door dit stuk PL/SQL wordt uitgevoerd, ziet het er ongeveer zo uit:
select e.ename
from scott.emp e
where e.empno = :B1
Dat is de PL/SQL-compiler die automatisch :B1
heeft gemaakt bind variabele voor uw v_empno
PL/SQL-variabele. En dat is wat Tom Kyte bedoelt dat je in PL/SQL niet echt een goed onderscheid kunt maken tussen hostvariabele en bindvariabele. Wanneer u PL/SQL schrijft, zijn de variabelen hostvariabelen wanneer ze worden gebruikt in PL/SQL-code en tegelijkertijd zijn ze bindvariabelen wanneer ze worden gebruikt in de ingesloten SQL-code. Je hoeft geen onderscheid te maken in PL/SQL, de compiler regelt het voor je.