Tänk på det här utdraget av 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
och v_ename
är värdvariabler. Här skapar du uttryckligen din bindningsvariabel för användning som :1
i ditt uttalande.
Tänk på det här utdraget av 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;
/
Återigen de deklarerade variablerna v_empno
och v_ename
kan betraktas som värdvariabler, men när de används i statisk SQL inom PL/SQL-koden omvandlas de automatiskt till bindningsvariabler av PL/SQL-kompilatorn/motorn - du behöver inte skapa din bindningsvariabel manuellt som i C# exempel. Om du undersöker den SQL som faktiskt exekveras av denna del av PL/SQL, kommer den att se ut ungefär så här:
select e.ename
from scott.emp e
where e.empno = :B1
Det är PL/SQL-kompilatorn som automatiskt har skapat :B1
bindningsvariabel för din v_empno
PL/SQL-variabel. Och det är vad Tom Kyte menar att du inte riktigt kan göra en ordentlig skillnad mellan värdvariabel och bindningsvariabel i PL/SQL. När du skriver PL/SQL är variablerna värdvariabler när de används i PL/SQL-kod och samtidigt är de bindningsvariabler när de används i den inbäddade SQL-koden. Du behöver inte göra någon skillnad i PL/SQL, kompilatorn tar hand om det åt dig.