プロが教える店舗&オフィスのセキュリティ対策術

お世話になります
よろしくお願いします。

さっそくで申し訳ないのですが
SQL分で
SELECT test01 FROM test WHERE test01 = ?
の「?」というのはどういう意味があるのでしょうか?

以上よろしくお願いします。

A 回答 (3件)

JavaでSQL文を実行するときに使われています。



例えば、
   SELECT test01 FROM test WHERE test01 = 100;
をJavaで実行しようとするとき、""で囲んで文字列のデータとして
   Statement クラス
のメソッドに渡します。渡された時点では単なる文字列ですから
SQLとして実行されるまでには、SQL文としてコンパイルされる必要があります。

特にこれが何回もループの中で繰り返されるようなことがあれば、
同じ回数コンパイルも繰り返されることになり大変な無駄となります。

そこで
   PreparedStatement クラス
を準備して、このクラスに渡せば最初の1回のコンパイルで済むようにしています。

さて、? ですが、更にこの機能を高めるために実際の値は渡す時点でセットできるようにしています。つまり、
   SELECT test01 FROM test WHERE test01 = ?
を前もってコンパイルしておき、実行する直前に例えば、
   ?に 100をセット
すると言う具合です。

? のことをプレースホルダとも言い、1つのSQL文に何箇所でも使えます。

実際の例が多くのページで紹介されていますので、
   PreparedStatement
等で検索して、是非実行してみてください。
    • good
    • 0

select文の検索条件を変数で与えたい場合、



select * from t1 where c1=変数名

といった書き方をしますよね?

それでは、select文を文字列で組み立て、動的実行をすることを考えましょう。

'select + from t1 where c1=' と値を部分を文字結合し、prepareしexecuteで実行する場合、値を定数で指定すると、値が変わるたびにprepareをやり直さなくてはなりません。
これを、値部分だけが違う場合は、1回だけprepareし、execute文で値を変えながら繰り返し実行する方法があり、この場合、値を入れる部分に「?」を入れておきます。
これは、クエスチョン・パラメタと呼ばれ、標準SQLでも規定されていると思います。

SQL文の文字列は、

select * from t1 where c1=?

としておき、prepareし、実行時はexecute文で値を入れます。

select * from t1 where c1=? and c2=?

などのように、複数を可変にすることも可能です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
無事理解できました。

また何かあればよろしくお願いします。

お礼日時:2008/02/26 16:59

#2です。

追記します。

?パラメタはwhere句だけでなく、SQL中に変数が書ける場所で基本的には指定できます。

例えば、

update t1
set c2=?
where c1=?

などです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!