2010年11月16日

[pgsql-jp: 40533] Re:ストアドでのOUTパラメーター複数受け渡し

2010/11/16 tadashi tanaka <tanaka@xxxxx>:
> テーブル関数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

投稿者 xml-rpc : 2010年11月16日 15:41
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/99939
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。