Comme j'ai trouvé SELECT * FROM t INTO my_data;
ne fonctionne que si:
DO $$
DECLARE
my_data t%ROWTYPE;
BEGIN
SELECT * FROM t INTO my_data WHERE id = ?;
END $$;
Ai-je raison?
Si je veux obtenir seulement 2-3 colonnes au lieu de toutes les colonnes. Comment puis-je définir my_data
?
C'est,
DO $$
DECLARE
my_data <WHAT HERE??>;
BEGIN
SELECT id,name,surname FROM t INTO my_data WHERE id = ?;
END $$;
obtenir seulement 2-3 colonnes au lieu de toutes les colonnes
Une façon: utilisez une variable record
:
DO $$
DECLARE
_rec record;
BEGIN
SELECT INTO _rec
id, name, surname FROM t WHERE id = ?;
END $$;
Notez que la structure d'un type record
n'est pas définie jusqu'à ce qu'elle soit affectée. Vous ne pouvez donc pas référencer des colonnes (champs) avant de le faire.
Une autre façon: attribuer plusieurs variables scalaires:
DO $$
DECLARE
_id int;
_name text;
_surname text;
BEGIN
SELECT INTO _id, _name, _surname
id, name, surname FROM t WHERE id = ?;
END $$;
Quant à votre premier exemple: %ROWTYPE
n'est que du bruit dans Postgres. La documentation :
(Étant donné que chaque table a un type composite associé du même nom, peu importe dans PostgreSQL si vous écrivez
%ROWTYPE
ou pas. Mais le formulaire avec%ROWTYPE
est plus portable.)
Alors:
DO $$
DECLARE
my_data t; -- table name serves as type name, too.
BEGIN
SELECT INTO my_data * FROM t WHERE id = ?;
END $$;