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

バインド変数と置換変数(&&を使用して入力)の違いは何ですか?

    バインド変数の違いについて混乱しているようです。 Oracleおよび置換変数 SQL*Plusで。

    置換変数から始めましょう。置換変数はSQL*Plusに固有であり、データベースの一部ではありません。たとえば、JDBCで使用しようとすると、機能しません。

    置換変数は、テキストの一部のみを保持できます。 SQL * Plusが入力行で置換変数を検出すると、その変数をそのテキストの内容に置き換えます。

    SQL> define subvar=X
    SQL> select * from dual where dummy = &subvar;
    old   1: select * from dual where dummy = &subvar
    new   1: select * from dual where dummy = X
    select * from dual where dummy = X
                                     *
    ERROR at line 1:
    ORA-00904: "X": invalid identifier
    

    SQL * Plusは、有効なSQLを提供したかどうかに関係なく、置換変数をそのテキスト値に置き換えたことに注意してください。上記の例では、&subvarを囲む一重引用符を省略しています。 無効なSQLが表示されたため、エラーが発生しました。

    oldで始まる行 およびnew SQL*Plusが置換変数を適用する前後に入力した行を表示します。 new lineは、データベースが実行しようとした行です。

    oldの表示を有効または無効にできます およびnew SET VERIFY ONを使用した行 およびSET VERIFY OFFSET DEFINE ONを使用して、置換変数の置換をオンまたはオフにすることもできます。 およびSET DEFINE OFF

    置換変数を使用して上記のクエリを実行する場合は、引用符で囲む必要があります:

    SQL> select * from dual where dummy = '&subvar';
    old   1: select * from dual where dummy = '&subvar'
    new   1: select * from dual where dummy = 'X'
    
    D
    -
    X
    

    &subvarの場合 たまたま有効な数値であった文字列が含まれています(例:5 )、引用符を使用せずに逃げることができますが、それはテキスト&subvarを削除したためです。 そしてそれをテキスト5に置き換えます たまたま有効なSQLが提供されます。

    たとえば、testというテーブルがあるとします。 次のデータが含まれています:

             A
    ----------
             1
             2
             3
             4
             5
    

    その後、私たちはできる

    SQL> define subvar=5
    SQL> select * from test where a = &subvar;
    old   1: select * from test where a = &subvar
    new   1: select * from test where a = 5
    
             A
    ----------
             5
    

    一方、バインド変数には型があります。それらは単純なテキスト値ではありません。それらの値はデータベースに送信され、データベースはそれらの値を設定することもできます。

    SQL> variable bindvar varchar2(1);
    SQL> exec :bindvar := 'X';
    
    PL/SQL procedure successfully completed.
    

    バインド変数を使用する場合は、バインド変数を引用符で囲みません。

    SQL> select * from dual where dummy = :bindvar;
    
    D
    -
    X
    
    SQL> select * from dual where dummy = ':bindvar';
    
    no rows selected
    

    上記の2番目の例では、DUALが原因で、行が返されませんでした。 テーブルにDUMMYの行がありません :bindvarというテキストを含む列 。

    間違ったタイプの値をバインド変数に割り当てようとすると、エラーが発生します:

    SQL> variable bindvar number;
    SQL> exec :bindvar := 'X';
    BEGIN :bindvar := 'X'; END;
    
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character to number conversion error
    ORA-06512: at line 1
    

    バインド変数はデータベースの標準部分であり、JDBCまたは選択したデータベースへの接続方法のいずれかで使用できます。

    最後に、variable num1 number およびvar num1 number どちらも同じことを意味します。どちらもバインド変数num1を定義します タイプnumbervar variableの単なる略語です 。




    1. SQLServerでユーザー定義関数を暗号化する方法

    2. PostgreSQL ConferenceEurope2018で学んだ5つのクールなこと

    3. PostgreSQLクエリはインデックススキャンでより高速に実行されますが、エンジンはハッシュ結合を選択します

    4. SQL Server:PARTITIONBYとGROUPBYの違い