sql >> Databasteknik >  >> RDS >> Oracle

Vad är skillnaden mellan PLSQL Bind-variabler och Host-variabler

Tänk på det här utdraget av 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 och v_ename är värdvariabler. Här skapar du uttryckligen din bindningsvariabel för användning som :1 i ditt uttalande.

Tänk på det här utdraget av 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;
/

Återigen de deklarerade variablerna v_empno och v_ename kan betraktas som värdvariabler, men när de används i statisk SQL inom PL/SQL-koden omvandlas de automatiskt till bindningsvariabler av PL/SQL-kompilatorn/motorn - du behöver inte skapa din bindningsvariabel manuellt som i C# exempel. Om du undersöker den SQL som faktiskt exekveras av denna del av PL/SQL, kommer den att se ut ungefär så här:

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

Det är PL/SQL-kompilatorn som automatiskt har skapat :B1 bindningsvariabel för din v_empno PL/SQL-variabel. Och det är vad Tom Kyte menar att du inte riktigt kan göra en ordentlig skillnad mellan värdvariabel och bindningsvariabel i PL/SQL. När du skriver PL/SQL är variablerna värdvariabler när de används i PL/SQL-kod och samtidigt är de bindningsvariabler när de används i den inbäddade SQL-koden. Du behöver inte göra någon skillnad i PL/SQL, kompilatorn tar hand om det åt dig.



  1. Utlösare för att söka efter dubbletter

  2. Metoder för att ställa in NLS-parametrar och deras prioriteringar (Oracle Database)

  3. Hur kan jag rensa minnet när jag kör ett långt PHP-skript? försökte avaktivera()

  4. Hur får man genererade nycklar av executeBatch utan ArrayIndexOutOfBoundsException?