Maison > base de données > tutoriel mysql > Comment puis-je gérer les types de retour SQL dynamiques dans PostgreSQL avec des noms et des types de colonnes variables ?

Comment puis-je gérer les types de retour SQL dynamiques dans PostgreSQL avec des noms et des types de colonnes variables ?

DDD
Libérer: 2025-01-22 23:46:11
original
103 Les gens l'ont consulté

How Can I Handle Dynamic SQL Return Types in PostgreSQL with Varying Column Names and Types?

SQL dynamique PostgreSQL et types de retour

Gestion des types de retour personnalisés avec différents noms et types de colonnes

Dans votre scénario, le type de retour changera en raison des différents noms et types de colonnes. Pour gérer cela, vous pouvez profiter de la capacité de PostgreSQL à renvoyer des types d'enregistrements anonymes :

<code class="language-sql">CREATE FUNCTION data_of(integer)
RETURNS SETOF record AS
...</code>
Copier après la connexion

Cependant, cette approche nécessite de spécifier manuellement les définitions de colonnes dans chaque appel de fonction :

<code class="language-sql">SELECT * FROM data_of(17)
AS foo (colum_name1 integer
      , colum_name2 text
      , colum_name3 real);</code>
Copier après la connexion

Pour éviter cette approche fastidieuse, vous pouvez utiliser des types de données de document comme JSON ou XML pour stocker des données non structurées :

<code class="language-sql">CREATE FUNCTION data_of(integer)
RETURNS JSONB AS
...</code>
Copier après la connexion

Cependant, cette approche sacrifiera les avantages des types de données structurés PostgreSQL.

Type de retour fixe utilisant la conversion de colonne

Si votre structure de données est cohérente (sauf pour les noms de colonnes), vous pouvez renvoyer un nombre fixe de colonnes correctement nommées et saisies :

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, col2 text, col3 text) AS
$func$
...</code>
Copier après la connexion

Pour plus de simplicité, chaque colonne est explicitement convertie en type TEXT.

Nombre variable de colonnes du même type

Si vous avez un nombre variable de colonnes du même type, vous pouvez utiliser un tableau pour stocker les valeurs :

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS
$func$
...</code>
Copier après la connexion
Copier après la connexion

Vous pouvez également renvoyer les noms de colonnes sous forme de tableau :

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS
$func$
...</code>
Copier après la connexion
Copier après la connexion

Renvoyer polymorphiquement toutes les colonnes du tableau

Pour renvoyer toutes les colonnes d'un tableau, quelle que soit leur structure, vous pouvez utiliser le pseudo type de données anyelement :

<code class="language-sql">CREATE FUNCTION data_of(_tbl_type anyelement, _id int)
RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT *
      FROM   %s  -- pg_typeof returns regtype, quoted automatically
      WHERE  id = 
      ORDER  BY datahora'
    , pg_typeof(_tbl_type))
   USING  _id;
END
$func$;</code>
Copier après la connexion

Appelez cette fonction avec NULL du type de table souhaité pour déterminer dynamiquement le type de retour :

<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal