0

likeキーワードを使用してプリペアドステートメントを作成しようとしています:

これはSQLステートメントです:

select user, 
       name_xml 
  from employee
 where name_xml like '<name>Varname</name>'

Varnameは動的変数です。任意の文字列値で構成できます。例:Varname = 'John Smith'

コード:

sql_name = @dbh.prepare(sql)

sql = 'select user, name_xml from employee
where name_xml  like '<name>?</name>''

sql_name.execute (Varname)

私が直面している問題は「?」です。ここで、Varname文字列値を含める必要があります。誰かがこれを手伝ってくれますか?

ありがとうございました!

4

2 に答える 2

3

ほとんどのドライバーは?、文字列リテラル内にある場合、a をプレースホルダーとして認識しません。これを回避するには、いくつかのオプションがあります。まず第一に、Ruby で文字列の作業を行うことができます。

sql = 'select user, name_xml from employee where name_xml like ?'
#...
sql_name.execute("<name>#{Varname}</name>")

または、断片をまとめて SQL に貼り付けることができます。

sql = %q{select user, name_xml from employee where name_xml like '<name>' || ? || '</name>'}
#...
sql_name.execute(Varname)

ほとんどの||データベースでは文字列を連結する必要がありますが、代わりに+orが必要になるものもあります。concat(...)

2 番目の for quoteへの切り替えに注意してください。これ%q{...}は単一引用符で囲まれた (Ruby) 文字列のように機能しますが、SQL が文字列リテラルに使用する埋め込み単一引用符をエスケープすることを心配する必要はありません。

于 2012-10-04T02:22:32.323 に答える
0

ご返信ありがとうございます!それはうまくいくはずです。私は以下を試しましたが、それも完全に機能します:

sql = 'select user, name_xml from employee
where name_xml  like ('#{test}')'


Varname = "John Smith" 
  test = "%<name>"+Varname+"</name>%"

 sql_name= @dbh.prepare(sql)

  sql_name.execute()

  sql_name.fetch do |row|
    sql_name =  row[0]
  end
于 2012-10-04T19:31:48.333 に答える