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