Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Qual é a diferença entre variáveis ​​PLSQL Bind e variáveis ​​Host


Considere este trecho 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 e v_ename são variáveis ​​de host. Aqui você cria explicitamente sua variável de ligação para uso como :1 em sua declaração.

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

Novamente as variáveis ​​declaradas v_empno e v_ename podem ser consideradas variáveis ​​de host, mas quando são usadas em SQL estático dentro do código PL/SQL, elas são automaticamente transformadas em variáveis ​​de ligação pelo compilador/motor PL/SQL - você não precisa criar manualmente sua variável de ligação como no Exemplo C#. Se você examinar o SQL que é realmente executado por este pedaço de PL/SQL, será algo assim:
   select e.ename
     from scott.emp e
    where e.empno = :B1

Esse é o compilador PL/SQL que criou automaticamente :B1 variável de ligação para seu v_empno variável PL/SQL. E é isso que Tom Kyte quer dizer que você não pode realmente fazer uma distinção adequada entre variável de host e variável de ligação em PL/SQL. Quando você escreve PL/SQL, as variáveis ​​são variáveis ​​de host quando usadas no código PL/SQL e, ao mesmo tempo, são variáveis ​​de ligação quando usadas no código SQL incorporado. Você não precisa fazer distinção em PL/SQL, o compilador cuida disso para você.