sql >> Databáze >  >> RDS >> Oracle

Jaký je rozdíl mezi proměnnými PLSQL Bind a hostitelskými proměnnými

Zvažte tento úryvek 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 a v_ename jsou hostitelské proměnné. Zde explicitně vytvoříte proměnnou vazby pro použití jako :1 ve vašem prohlášení.

Zvažte tento úryvek 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;
/

Opět deklarované proměnné v_empno a v_ename lze považovat za hostitelské proměnné, ale když jsou použity ve statickém SQL v rámci kódu PL/SQL, kompilátor/engine PL/SQL je automaticky převede na proměnné vazby - nemusíte ručně vytvářet proměnnou vazby jako v Příklad C#. Pokud prozkoumáte SQL, který je skutečně spouštěn touto částí PL/SQL, bude vypadat nějak takto:

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

To je kompilátor PL/SQL, který automaticky vytvořil :B1 proměnnou vazby pro váš v_empno PL/SQL proměnná. A to je to, co Tom Kyte znamená, že v PL/SQL opravdu nemůžete správně rozlišovat mezi hostitelskou proměnnou a proměnnou vazby. Když píšete PL/SQL, proměnné jsou hostitelské proměnné, když se používají v kódu PL/SQL, a zároveň jsou to vazebné proměnné, když jsou použity ve vloženém kódu SQL. V PL/SQL nemusíte dělat rozdíly, kompilátor se o to postará za vás.



  1. Vytvořit Image Trackback pro externího webového vydavatele, který bude odkazovat na můj web

  2. Záludný příkaz SQL přes 3 tabulky

  3. Zmenšete 19 sloupců na 5 sloupců

  4. Chyba Oracle SQL:ORA-00923:Z klíčového slova nebylo nalezeno, kde se očekávalo