2

位置パラメータに依存するのは好きではありません。 HDBCで可能ですか?

このパッケージの実行中のさまざまな関数に、引数として渡す[(String, SqlValue)]のではなく、渡していることがわかりました。[SqlValue]

一言で言えば、むしろ欲しい

select 
  t.f1
  , t.f2
  , t.f3
from
  schema.table t
where
 t.f1 > @param1
 and t.f2 < @param2

よりも

select 
  t.f1
  , t.f2
  , t.f3
from
  schema.table t
where
 t.f1 > ?
 and t.f2 < ?
4

1 に答える 1

1

hdbc を直接使用するわけではありませんが、shakespeare-text パッケージを使用して行います。

quickQuery cn (T.unpack
                 [st|select bar, baz, foo
                       from table1 r
                      inner join location l on r.locat_id = l.location_id
                      where r.record_id = #{pageIdxId page}
                        and foo > #{var1 + var2}
                      order by 1|]) []

#{} プレースホルダーの haskell 変数と式に注目してください。

ただし、ストリングスプライシングには注意してください。

文字列値でSQLエスケープ関数を使用します。

sqlEscape :: Text -> Text
sqlEscape = T.replace "'" "''" 

それから

[st|update foo set bar = '#{sqlEscape someString}' where recid = #{myRecId}|]

または、タスクを実行できる場合は、shakspeare-text ライブラリに小さな変更を加えて、すべての isString 型を自動的にエスケープすることができます。

于 2013-10-15T19:29:02.680 に答える