MySQLのストアドで少しはまった
id:habuakihiroさんが書かれた『楽々ERDレッスン』を今さらながら買って読んだ。イベント系のテーブルから考えるという方法論を学べたのが大きな収穫。
私は以前からO/Rマッパーというものになじめず、Railsライクのフレームワークを(少なくとも趣味的な活動では)使う気になれないでいる。SQLを書くのに抵抗がないというか、プログラムを書くよりSQLを書くほうが好きなのかもしれない(えー)。
前掲書ではストアドの積極的な利用を勧めていて、それは私の性質とぴったんこなので、今作っているWebアプリでバリバリ活用してやろうと思い、書き始めている。
XAMPP環境なのでDBはMySQL。ストアドをMySQLで書くのは初めてで、何箇所かはまったのでメモしておく。
- ストアド内では「LOCK TABLES」できない
- ストアド内で「LOCK TABLES」しようとしたらエラーが出た。マニュアルを調べると、ストアドの制約だとしっかり書かれていた。もともとInnoDBなので、トランザクションで対応することにした。
- RAISERRORのような仕組がない
- エラー情報をクライアントに返したいのだが、RAISERRORのような仕組がない。エラー情報以外にも戻り値を返したい場面もあるので、単純にストアドファンクションを使うわけにもいかない。仕方がないので、ストアドプロシージャのOUTパラメータで対応することにした。
PostgreSQLならもっと自由にストアドが書けるのだが、制約があるほど燃える性格なので、MySQLでできる限り頑張ってみようと思っている。