web-dev-qa-db-fra.com

Déclarez la variable de type de ligne dans PL / pgSQL

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 $$;
20
Vyacheslav

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 $$;
24