Maison >base de données >tutoriel mysql >Comment récupérer plusieurs champs sous la forme d'un seul enregistrement dans PostgreSQL à l'aide de PL/pgSQL ?
Lorsque vous travaillez avec des interactions de base de données, il devient souvent nécessaire de récupérer les données de plusieurs tables et de les présenter sous forme d'enregistrement. un dossier unifié. PostgreSQL permet cette fonctionnalité en utilisant le type RECORD dans PL/pgSQL, permettant aux développeurs de récupérer des champs de différentes tables en tant que champs au sein d'un seul enregistrement.
À récupérez les champs de plusieurs tables en tant que champs dans un seul enregistrement, PL/pgSQL utilise le type RECORD. Voici une version modifiée de votre exemple :
CREATE OR REPLACE FUNCTION get_object_fields(name text) RETURNS RECORD AS $$ BEGIN -- Fetch fields f1, f2, and f3 from table t1 -- Fetch fields f4, f5 from table t2 -- Fetch fields f6, f7, and f8 from table t3 -- Create a record to store the fetched fields RETURN RECORD( f1 TEXT, f2 TEXT, f3 TEXT, f4 TEXT, f5 TEXT, f6 TEXT, f7 TEXT, f8 TEXT ); END $$ language plpgsql;
Lorsque vous faites face à des situations où certains champs peuvent être stockés sur plusieurs lignes dans une seule table, le type RECORD peut toujours être utilisé efficacement. Dans votre exemple avec la table 'user', vous pouvez modifier le code comme suit :
CREATE OR REPLACE FUNCTION get_two_users_from_school(schoolid int) RETURNS my_type AS $$ DECLARE result my_type; temp_result RECORD; user1 RECORD; user2 RECORD; BEGIN SELECT id, name INTO temp_result FROM user WHERE school_id = schoolid LIMIT 2; -- Split the fetched rows into individual user records user1.user1_id := temp_result.id; user1.user1_name := temp_result.name; -- Handle the second row if available IF FOUND THEN user2.user2_id := temp_result.id; user2.user2_name := temp_result.name; END IF; -- Return the combined user record result.user1_id := user1.user1_id; result.user1_name := user1.user1_name; result.user2_id := user2.user2_id; result.user2_name := user2.user2_name; RETURN result; END $$ language plpgsql;
Bien que l'utilisation de CREATE TYPE puisse sembler raisonnable pour renvoyer des résultats polymorphes, PL/ pgSQL fournit une approche plus flexible et plus robuste. En abusant du type RECORD, vous pouvez renvoyer un nombre variable de colonnes en fonction de l'entrée, ce qui le rend approprié pour gérer des messages d'erreur facultatifs ou des informations supplémentaires.
Voici un exemple :
CREATE FUNCTION test_ret(a TEXT, b TEXT) RETURNS RECORD AS $$ DECLARE ret RECORD; BEGIN IF LENGTH(a) < LENGTH(b) THEN ret := (TRUE, a || b, 'a shorter than b'); ELSE ret := (FALSE, b || a); END IF; RETURN ret; END; $$ LANGUAGE plpgsql;
Cette fonction renvoie dynamiquement deux ou trois colonnes en fonction de l'entrée et peut être utilisée pour divers scénarios, tels que le renvoi du statut de réussite et des messages d'erreur facultatifs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!