Oracle
 sql >> Base de données >  >> RDS >> Oracle

Quelle est la différence entre les variables PLSQL Bind et les variables Host

Considérez cet extrait 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 et v_ename sont des variables hôtes. Ici, vous créez explicitement votre variable de liaison à utiliser comme :1 dans votre déclaration.

Considérez cet extrait 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;
/

Encore une fois les variables déclarées v_empno et v_ename peuvent être considérées comme des variables hôtes, mais lorsqu'elles sont utilisées en SQL statique dans le code PL/SQL, elles sont automatiquement transformées en variables de liaison par le compilateur/moteur PL/SQL - vous n'avez pas à créer manuellement votre variable de liaison comme dans le Exemple C#. Si vous examinez le SQL qui est réellement exécuté par ce morceau de PL/SQL, il ressemblera à ceci :

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

C'est le compilateur PL/SQL qui a créé automatiquement :B1 variable de liaison pour votre v_empno Variable PL/SQL. Et c'est ce que Tom Kyte veut dire que vous ne pouvez pas vraiment faire une distinction appropriée entre la variable hôte et la variable de liaison en PL/SQL. Lorsque vous écrivez en PL/SQL, les variables sont des variables hôtes lorsqu'elles sont utilisées dans le code PL/SQL et en même temps, elles sont des variables de liaison lorsqu'elles sont utilisées dans le code SQL intégré. Vous n'avez pas besoin de faire la distinction en PL/SQL, le compilateur s'en charge pour vous.