Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Was ist der Unterschied zwischen PLSQL Bind-Variablen und Host-Variablen?

Betrachten Sie dieses Snippet von 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 und v_ename sind Hostvariablen. Hier erstellen Sie explizit Ihre Bind-Variable zur Verwendung als :1 in Ihrer Erklärung.

Betrachten Sie diesen Ausschnitt von 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;
/

Wieder die deklarierten Variablen v_empno und v_ename können als Hostvariablen betrachtet werden, aber wenn sie in statischem SQL innerhalb des PL/SQL-Codes verwendet werden, werden sie vom PL/SQL-Compiler/der PL/SQL-Engine automatisch in Bind-Variablen umgewandelt – Sie müssen Ihre Bind-Variablen nicht wie in der manuell erstellen C#-Beispiel. Wenn Sie das SQL untersuchen, das tatsächlich von diesem Stück PL/SQL ausgeführt wird, sieht es etwa so aus:

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

Das ist der PL/SQL-Compiler, der automatisch :B1 erstellt hat bind-Variable für Ihr v_empno PL/SQL-Variable. Und das meint Tom Kyte, dass man in PL/SQL nicht wirklich zwischen Host-Variablen und Bind-Variablen unterscheiden kann. Wenn Sie PL/SQL schreiben, sind die Variablen Hostvariablen, wenn sie im PL/SQL-Code verwendet werden, und gleichzeitig sind sie Bind-Variablen, wenn sie im eingebetteten SQL-Code verwendet werden. Sie müssen in PL/SQL keinen Unterschied machen, das erledigt der Compiler für Sie.