sql >> Database >  >> RDS >> Oracle

Wat is het verschil tussen PLSQL Bind-variabelen en Host-variabelen?

Overweeg dit fragment van 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 en v_ename zijn hostvariabelen. Hier maakt u expliciet uw bindvariabele aan voor gebruik als :1 in uw verklaring.

Overweeg dit fragment van 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;
/

Nogmaals de gedeclareerde variabelen v_empno en v_ename kunnen worden beschouwd als hostvariabelen, maar wanneer ze worden gebruikt in statische SQL binnen de PL/SQL-code, worden ze automatisch omgezet in bindvariabelen door de PL/SQL-compiler/engine - u hoeft uw bindvariabele niet handmatig te maken zoals in de C# voorbeeld. Als je de SQL bekijkt die daadwerkelijk door dit stuk PL/SQL wordt uitgevoerd, ziet het er ongeveer zo uit:

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

Dat is de PL/SQL-compiler die automatisch :B1 heeft gemaakt bind variabele voor uw v_empno PL/SQL-variabele. En dat is wat Tom Kyte bedoelt dat je in PL/SQL niet echt een goed onderscheid kunt maken tussen hostvariabele en bindvariabele. Wanneer u PL/SQL schrijft, zijn de variabelen hostvariabelen wanneer ze worden gebruikt in PL/SQL-code en tegelijkertijd zijn ze bindvariabelen wanneer ze worden gebruikt in de ingesloten SQL-code. Je hoeft geen onderscheid te maken in PL/SQL, de compiler regelt het voor je.



  1. Help ons de IDE te moderniseren in MS Access - uw stem telt!

  2. Queryresultaten filteren in PostgreSQL

  3. Mysql-service ontbreekt

  4. Kan eenvoudige SQL-insertie niet aan het werk krijgen