思いつくままプログラミングネタを書き殴ります。PL/pgSQLで戻り値にテーブルの代わりに型を使うPostgreSQLのPL/pgSQLでは戻り値として、テーブルの構造をした値を返せます。4444複雑な検索をPHPなどのプログラムに記述せずPL/pgSQLで作るときには、この仕組みが欠かせません。TABLE()内の戻り値のカラムを定義するところに、変な癖があるので注意が必要です。今回はPostgreSQL8.4.4で確認しています。説明のためのテーブルを作成します。'def');ここで、user_nameだけを返すPL/pgSQLを作成してみます。癖を知らずに書くとおそらく次のように書くと思います。plpgsql;動作されてみるとすぐわかりますが、正しい答えを返しません。二行のNULLが返ってきました。TABLE()内で定義した名前をBEGIN?END内で使うと正しく動作しないようです。そこで、名前がぶつからない様に修正します。plpgsql;これは正しい値を返します。基本は他に出てこないプレフィックスを付けることで回避できます。DECLARE?BEGIN間にはw_をつけています。すべてがこれでうまくいくわけではありません。次の関数をみてください。plpgsql;これは、先ほど定義した関数を内部で呼んでいます。TABLE()内の名前とBEGIN?END間の名前がかぶっているため動きません。plpgsql;何か、きもいっすね(笑)というか、PHPとかで利用する場合、実害もあります。row['r_user_name2']のようにそれぞれ変えなければなりません。これはちょっと、めんどくさいです。good_sample2()";のように、名前を変換してやれば同じようにアクセスできますが、やはりめんどうです。そこで、私が使っている解決策ですが、戻り値のテーブルを作ることで名前の重複が避けられます。plpgsql;これで、心置きなくBEGIN?END間で好きな名前が使えます。nice_sample1()";で$row['user_name']でアクセス可能です。このサンプルだけ見てしまうと、検索するのにいちいちテーブル作るのか!と思ってしまうかもしれませんが、カラムが多かったり今回の例のように多段で関数をコールする場合などは、参照用のテーブルを使う方が便利です。私も多段で無い場合は普通、TABLE()を使っています。(12/28)PostgreSQLとRubyを組み合わせてブラックリストチェックの速度を測ってみた。