[pgsql-jp: 28714] Re: トリガの作成時のエラーについて。長文です。

naoki kishida kishida @ fk.urban.ne.jp
2003年 1月 20日 (月) 01:54:07 JST


きしだです

> そんなことしなくても
>   UPDATE oya SET l_update=utc WHERE oya_cd=old.kodomo_cd;
> とかでできませんか?

あ、まちがえてました。
これだからよっぱらいは。

  UPDATE oya SET l_update=utc WHERE oya_cd=new.kodomo_cd;

ですね。
そしたらファンクションに引数を渡す必要がなくなります。


あと、

> #phpで作っているアプリケーションなのですが
> #php側でSQLを動的に作って実行させたほうがこの場合は楽なのでしょうか・・

ですけど、データベース側でやったほうが楽です。

まず、記述が簡潔に出来ます。
どのような言語でも、データベースの外側でクエリーを組み合わせて処理をする
場合
  result = 問合 "select * from table_a";
  更新 "insert into table_b(key) values(" + result.key + ")";
のようなコードになると思います。このときkeyが自由な文字列の場合はシング
ルクオートなどの特殊文字に気を使う必要があります。
これがplpgsqlの場合
  select into tmp * from table_a;
  insert into tableb(key) values(tmp.key);
となって、すっきりします。特殊文字もよきにはからってくれます。
また、データを追加したとき、その関連データも作成する場合
  result = 更新 "insert into table_c(value) values(" + value1 + ")";
  oid = result.get_oid;
  result = 問合 "select * from table_b where oid=" + oid;
  更新 "insert into table_d(key,value) "
     + "values(" + result.key + "," + value2 + ")";
のようなコードを書く必要があります。また、このときSQL文は長くなる傾向が
あって改行が必要ですが、その改行が文字列リテラル中での改行となりみにくく
なります。
get_oidの部分は言語・ライブラリによって違い、たとえばJavaのJDBC2ドライバー
の場合Java標準ではそのような機能が用意されてないといったこともあります。
plpgsqlを使えば
  insert into table_c(value) values(value1);
  get diagnostics o = result_oid;
  select into tmp_table * from table_c where oid=o;
  insert into table_d(key,value) values(tmp_table.key,value2);
のように結果変数代入や結果取得、文字列リテラルがなくなりすっきりします。



でも、本質的な利点はそこではなく。
ファンクションなどを使わずにデータベースを使ったアプリケーションを作る場
合、とくにWebの場合
  データベース設計 -> 画面遷移実装 -> データ処理
の順に作業を進めることが多いと思います。
ここで問題になるのは、データベース設計のときにデータ処理のことまで考えて
いるのに、実装するのにタイムラグがあって忘れてるということです。
また、データベース設計者と実装者が違うことは多くあり、その場合、データベー
ス設計者が実装者に、「この場合はこのテーブルにデータを入れて、OID使って
キーを読み込んで、別のテーブルにもデータを追加」などという説明を、ときに
はSQLを交えつつ説明する必要があります。
データベースを設計しながらplpgsqlををひとりでやるにしても、「昔の
自分は他人」の法則が成り立ち、タイムラグがあれば設計のことなんか忘れてい
るので、結局考え直す必要があります。資料を残せばいいというのもありますが、
結局その資料はSQL文になります。

これが、plpgsqlを使うと、「データベースを設計したらデータベースの処理
をプログラムしましょう」とすることで、実装のタイムラグがなくなりほとんど
情報伝達の必要がなくなります。

これはかなり大きいと思います。

----
岸田 哉生(きしだ なおき)
	email:kishida @ fk.urban.ne.jp
	http://www.fk.urban.ne.jp/home/kishida/




pgsql-jp メーリングリストの案内