2011-10-16 16 views
6

これら2つの変数宣言の違いは何ですか?バインド変数と&&を使用して入力した変数の違いは何ですか?

1:num number:='&&num';
2:variable num1 number;

両方の場合において、私は、また、他のファイルに&num又は&&numを使用してnumを参照 とバインド変数:num1の場合にできるので。

また、私はもう1つ混乱しています。以下のステートメントのいずれかが何とか違うかどうか、どちらも有効で、同じ意味ですか?

1:variable num1 number;
2:var num1 number;

答えて

29

あなたはSQL * PlusでOracleでバインド変数置換変数の違いについていくつかの混乱を持っているように見えます。

まずは置換変数から始めましょう。置換変数はSQL * Plus固有のもので、データベースの一部ではありません。たとえば、JDBCでそれらを使用しようとするとうまくいきません。

置換変数は、テキストを保持することができます。 SQL * Plusは入力の行に置換変数に遭遇した場合、それは、そのテキストの内容を変数に置き換えられます: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を与えました。上記の例では、 &subvarを一重引用符で囲まずに無効なSQLを与えているので、エラーが発生しました。

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

SET VERIFY ONSET VERIFY OFFを使用して、oldnew行の表示を有効または無効にすることができます。 SET DEFINE ONSET 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. 

DUALテーブルが持つ行がありませんので、上記の2番目の例では

 
SQL> select * from dual where dummy = :bindvar; 

D 
- 
X 

SQL> select * from dual where dummy = ':bindvar'; 

no rows selected 

、我々は何も行を返さないしまいましたテキスト:bindvarを含むDUMMY列。

あなたがバインド変数に間違った型の値を代入しようとすると、エラーになります:

 
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 numbervar num1 numberの両方が同じことを意味します。両方とも、タイプnumberのバインド変数num1を定義します。 varは、variableの略語です。

関連する問題