バインド変数の違いについて混乱しているようです。 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 OFF
。 SET 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
を定義します タイプnumber
。 var
variable
の単なる略語です 。