この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
およびv_ename
ホスト変数です。ここでは、:1
として使用するバインド変数を明示的に作成します あなたの声明の中で。
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;
/
ここでも、宣言された変数v_empno
およびv_ename
ホスト変数と見なすことができますが、PL / SQLコード内の静的SQLで使用される場合、PL/SQLコンパイラ/エンジンによって自動的にバインド変数に変換されます。のようにバインド変数を手動で作成する必要はありません。 C#の例。このPL/SQLによって実際に実行されるSQLを調べると、次のようになります。
select e.ename
from scott.emp e
where e.empno = :B1
これは、:B1
を自動的に作成したPL/SQLコンパイラです。 v_empno
のバインド変数 PL/SQL変数。これが、Tom Kyteが意味することですが、PL/SQLではホスト変数とバインド変数を適切に区別することはできません。 PL / SQLを作成する場合、変数はPL / SQLコードで使用される場合はホスト変数であると同時に、埋め込みSQLコードで使用される場合はバインド変数です。 PL/SQLで区別する必要はありません。コンパイラが自動的に区別します。