sql >> データベース >  >> RDS >> Oracle

PLSQLバインド変数とホスト変数の違いは何ですか

    この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で区別する必要はありません。コンパイラが自動的に区別します。



    1. MySQLに挿入、削除されたテーブル(マジックテーブル)

    2. Doctrine2でグループ内で注文する

    3. Oracle列の自動変更タイムスタンプタイプはありますか?

    4. PostgreSQLで複数の列の名前を変更する