[pgsql-jp: 40533] Re: ストアドでのOUTパラメーター複数受け渡し
Itagaki Takahiro
itagaki.takahiro @ gmail.com
2010年 11月 16日 (火) 15:41:27 JST
2010/11/16 tadashi tanaka <tanaka @ shrine.co.jp>:
> テーブル関数1つのみで受け渡すと問題ないようですが、同時に他の値もOUTパラメー
> ターで受け渡そうとするとエラーとなります。
> PostgresSQLのバージョンは8.4.4です。
> 実行すると、「型integerの入力構文が無効です…」のエラーが発生します。
OUTパラメータというよりは、SELECT INTO では、単体の場合を除き
レコード型に代入できないという PL/pgSQL の制限に引っ掛かって
いるようです。9.0だとエラーメッセージが親切になっていました。
[8.4] ERROR: invalid input syntax for integer: "(1,2)"
[9.0] ERROR: record or row variable cannot be part of multiple-item INTO list
回避する方法は、レコードの各フィールドに分割して代入するか、
select (io_tb).*, o_hensu1 into tb.col1, tb.col2, hensu1 from sub_func(tb);
いったん record 型として受けておいて、その後改めて代入する手があります。
DECLARE
r record;
BEGIN
select * into r from sub_func(tb);
tb := r.io_tb;
hensu1 := r.o_hensu1;
参考までに、エラーを履いている部分のコメントです。
「作り込みが足りなくてごめんなさい」と書いてある気がします。
----
Currently, a row or record variable can be the single INTO target,
but not a member of a multi-target list. So we throw error if there
is a comma after it, because that probably means the user tried to
write a multi-target list. If this ever gets generalized, we should
probably refactor read_into_scalar_list so it handles all cases.
----
--
Itagaki Takahiro
pgsql-jp メーリングリストの案内