Oracle
 sql >> Database >  >> RDS >> Oracle

Qual è la differenza tra le variabili Bind PLSQL e le variabili Host

Considera questo frammento di 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 sono variabili host. Qui crei esplicitamente la tua variabile bind da usare come :1 nella tua dichiarazione.

Considera questo frammento di 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;
/

Di nuovo le variabili dichiarate v_empno e v_ename possono essere considerate variabili host, ma quando vengono utilizzate in SQL statico all'interno del codice PL/SQL, vengono automaticamente trasformate in variabili di collegamento dal compilatore/motore PL/SQL - non è necessario creare manualmente la variabile di collegamento come nel Esempio C#. Se esamini l'SQL che viene effettivamente eseguito da questo pezzo di PL/SQL, sarà simile a questo:

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

Questo è il compilatore PL/SQL che ha creato automaticamente :B1 variabile bind per il tuo v_empno Variabile PL/SQL. E questo è ciò che Tom Kyte significa che non puoi davvero fare una distinzione corretta tra variabile host e variabile bind in PL/SQL. Quando si scrive PL/SQL, le variabili sono variabili host se utilizzate nel codice PL/SQL e allo stesso tempo sono variabili di collegamento se utilizzate nel codice SQL incorporato. Non è necessario fare distinzioni in PL/SQL, il compilatore se ne occupa per te.