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

Hvad er forskellen mellem PLSQL Bind-variabler og Host-variabler

Overvej dette uddrag af 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 og v_ename er værtsvariabler. Her opretter du eksplicit din bind-variabel til brug som :1 i din erklæring.

Overvej dette uddrag af 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;
/

Igen de erklærede variabler v_empno og v_ename kan betragtes som værtsvariabler, men når de bruges i statisk SQL inden for PL/SQL-koden, bliver de automatisk omdannet til bindevariabler af PL/SQL-kompileren/motoren - du behøver ikke manuelt at oprette din bind-variabel som i C# eksempel. Hvis du undersøger den SQL, der faktisk udføres af dette stykke PL/SQL, vil det se nogenlunde sådan ud:

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

Det er PL/SQL-kompileren, der automatisk har oprettet :B1 bind variabel for din v_empno PL/SQL variabel. Og det er det, Tom Kyte mener, at man ikke rigtig kan skelne mellem værtsvariabel og bindevariabel i PL/SQL. Når du skriver PL/SQL, er variablerne værtsvariabler, når de bruges i PL/SQL-kode, og samtidig er de bindevariabler, når de bruges i den indlejrede SQL-kode. Du behøver ikke at skelne i PL/SQL, compileren tager sig af det for dig.



  1. Tilføjelse af et forespørgselstip, når du kalder Table-Valued Function

  2. Forskellen mellem nøgle, primær nøgle, unik nøgle og indeks i MySQL

  3. Connection Pool-strategi:god, dårlig eller grim?

  4. Fejlkode:1215. Kan ikke tilføje fremmednøglebegrænsning (fremmednøgler)