[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 メーリングリストの案内