PostgreSQLのPL/pgSQLでは戻り値として、テーブルの構造をした値を返せます。
複雑な検索をPHPなどのプログラムに記述せずPL/pgSQLで作るときには、この仕組みが欠かせません。
しかし、TABLE()内の戻り値のカラムを定義するところに、変な癖があるので注意が必要です。
ここで、user_nameだけを返すPL/pgSQLを作成してみます。癖を知らずに書くとおそらく次のように書くと思います。
動作されてみるとすぐわかりますが、正しい答えを返しません。二行のNULLが返ってきました。
これは正しい値を返します。基本は他に出てこないプレフィックスを付けることで回避できます。
これは、先ほど定義した関数を内部で呼んでいます。TABLE()内の名前とBEGIN?END間の名前がかぶっているため動きません。
のように、名前を変換してやれば同じようにアクセスできますが、やはりめんどうです。
そこで、私が使っている解決策ですが、戻り値のテーブルを作ることで名前の重複が避けられます。
と思ってしまうかもしれませんが、カラムが多かったり今回の例のように多段で関数をコールする場合などは、参照用のテーブルを使う方が便利です。