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
DDDoriginal
2025-01-22 23:31:12555parcourir

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 :

<code class="language-sql">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$;</code>

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.

<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);
-- 将pcdmet替换为任何其他表名。</code>

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