Maison > base de données > tutoriel mysql > Comment une fonction PL/pgSQL peut-elle renvoyer dynamiquement les résultats de diverses requêtes SELECT ?

Comment une fonction PL/pgSQL peut-elle renvoyer dynamiquement les résultats de diverses requêtes SELECT ?

DDD
Libérer: 2025-01-22 23:31:12
original
622 Les gens l'ont consulté

How Can a PL/pgSQL Function Dynamically Return Results from Various SELECT Queries?

Refactorisez les fonctions PL/pgSQL pour renvoyer la sortie de différentes requêtes SELECT

SQL dynamique et types de retour

Renvoie les enregistrements de type non défini

La fonction d'origine déclarait un type de retour de texte, mais maintenant l'objectif est d'exécuter l'instruction SQL générée et de renvoyer le résultat sous forme d'enregistrement. Pour ce faire, vous devez utiliser du SQL dynamique et gérer le renvoi d'enregistrements d'un type qui n'est pas encore défini.

Types personnalisés avec mutabilité des types numériques et de données

Une approche consiste à créer un type de retour personnalisé avec un nombre fixe de colonnes mais un type de données variable. Cependant, cela nécessite de définir une liste de définitions de colonnes pour chaque appel, ce qui devient peu pratique lorsque les noms de colonnes et les types de données ne sont pas connus à l'avance.

Utiliser des types polymorphes

pg_typeof() Renvoie le nom de la table comme type d'identifiant d'objet (regtype). Lorsqu'ils sont automatiquement convertis en texte, les identifiants sont automatiquement entre guillemets et qualifiés de modèle, empêchant ainsi l'injection SQL.

RETOUR QUERY EXECUTE

La méthode préférée pour exécuter du SQL dynamique et renvoyer des lignes est RETURN QUERY EXECUTE. Il vous permet d'exécuter des requêtes SQL et de renvoyer les résultats sous forme d'ensembles de lignes avec des types de lignes bien définis.

Exemple de code

Supposons que vous souhaitiez renvoyer toutes les colonnes d'une table en fonction du paramètre de type de table :

CREATE OR REPLACE FUNCTION data_of(_tbl_type anyelement, _id int)
  RETURNS SETOF anyelement
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT *
      FROM   %s  -- 自动用双引号括起来并进行模式限定
      WHERE  id = 
      ORDER  BY datahora'
    , pg_typeof(_tbl_type))
   USING  _id;
END
$func$;
Copier après la connexion

Utilisation

Appelez cette fonction avec le type de table comme premier paramètre et l'ID comme deuxième paramètre. Cette fonction renverra toutes les colonnes de l'enregistrement avec l'ID donné dans la table spécifiée.

SELECT * FROM data_of(NULL::pcdmet, 17);
-- 将pcdmet替换为任何其他表名。
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!

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