バインド変数の違いについて混乱しているようです。 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の単なる略語です 。