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 ?

Comment récupérer plusieurs champs sous la forme d'un seul enregistrement dans PostgreSQL à l'aide de PL/pgSQL ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-05 05:49:43602parcourir

How to Retrieve Multiple Fields as a Single Record in PostgreSQL Using PL/pgSQL?

Récupération de plusieurs champs sous forme d'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.

Retour des champs de différentes tables sous la forme 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;

Gestion des lignes avec plusieurs champs à partir d'une seule table

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;

Gestion des résultats polymorphes

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn