sql >> Base de Datos >  >> RDS >> Oracle

¿Cuál es la diferencia entre las variables PLSQL Bind y las variables Host?

Considere este fragmento de 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 y v_ename son variables del anfitrión. Aquí crea explícitamente su variable de vinculación para usarla como :1 en su declaración.

Considere este fragmento de 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;
/

De nuevo las variables declaradas v_empno y v_ename pueden considerarse variables del host, pero cuando se usan en SQL estático dentro del código PL/SQL, el compilador/motor PL/SQL las convierte automáticamente en variables de enlace; no tiene que crear manualmente su variable de enlace como en el Ejemplo de C#. Si examina el SQL que realmente ejecuta esta pieza de PL/SQL, se verá así:

   select e.ename
     from scott.emp e
    where e.empno = :B1

Ese es el compilador PL/SQL que automáticamente ha creado :B1 vincular variable para su v_empno Variable PL/SQL. Y eso es lo que Tom Kyte quiere decir que realmente no se puede hacer una distinción adecuada entre la variable del host y la variable de vinculación en PL/SQL. Cuando escribe PL/SQL, las variables son variables del host cuando se usan en código PL/SQL y, al mismo tiempo, son variables de vinculación cuando se usan en el código SQL incorporado. No necesita hacer una distinción en PL/SQL, el compilador lo hace por usted.