web-dev-qa-db-ja.com

PL / pgSQLで行型変数を宣言する

SELECT * FROM t INTO my_data;は、次の場合にのみ機能します。

DO $$
DECLARE
my_data t%ROWTYPE;
BEGIN
SELECT * FROM t INTO my_data WHERE id = ?;
END $$;

私は正しいですか?

すべての列ではなく2〜3列だけを取得する場合。 my_dataを定義するにはどうすればよいですか?

あれは、

DO $$
DECLARE
my_data <WHAT HERE??>;
BEGIN
SELECT id,name,surname FROM t INTO my_data WHERE id = ?;
END $$;
20
Vyacheslav

すべての列ではなく2〜3列のみを取得する

1つの方法: record 変数を使用します。

DO $$
DECLARE
   _rec record;
BEGIN
SELECT INTO _rec
            id, name, surname FROM t WHERE id = ?;
END $$;

record型の構造は、割り当てられるまで未定義であることに注意してください。したがって、その前に列(フィールド)を参照することはできません。

別の方法:複数のスカラー変数を割り当てる:

DO $$
DECLARE
   _id int;
   _name text;
   _surname text;
BEGIN
SELECT INTO _id, _name, _surname
             id,  name,  surname FROM t WHERE id = ?;
END $$;

あなたの最初の例として:%ROWTYPEはPostgresの単なるノイズです。 ドキュメント

(すべてのテーブルには同じ名前の関連付けられた複合型があるため、PostgreSQLでは実際に%ROWTYPE か否か。しかし、%ROWTYPEの方が移植性があります。)

そう:

DO $$
DECLARE
   my_data t;  -- table name serves as type name, too. 
BEGIN
   SELECT INTO my_data  * FROM t WHERE id = ?;
END $$;
24