Une fonction SQL personnalisée, nommée getStuff, a été créée pour exécuter une instruction SELECT de base. Lorsque vous utilisez la fonction sous la forme select * from getStuff('hello'), elle récupère toutes les lignes de la table stuff en fonction de la valeur du paramètre fourni.
Cependant, la question se pose : comment pouvons-nous implémenter le tri et limiter dans cette fonction pour améliorer l'efficacité et récupérer uniquement les lignes souhaitées ? Utiliser les clauses order by et limit directement dans la fonction getStuff serait inefficace car cela implique de récupérer toutes les lignes avant d'appliquer les filtres.
La solution recommandée consiste à utiliser PL/pgSQL, un langage procédural dans PostgreSQL, pour créer le fonction. PL/pgSQL permet la construction et l'exécution de requêtes SQL dynamiques, offrant une flexibilité dans la gestion des valeurs des paramètres.
Un exemple de fonction dans PL/pgSQL :
CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int) RETURNS SETOF stuff AS $func$ BEGIN RETURN QUERY EXECUTE ' SELECT * FROM stuff WHERE col = ORDER BY ' || quote_ident(_orderby) || ' ASC LIMIT ' USING _param, _limit; END $func$ LANGUAGE plpgsql;
Cette fonction prend trois paramètres : _param (la valeur à filtrer), _orderby (la colonne à trier) et _limit (le nombre maximum de lignes à renvoyer).
Pour appeler le function :
SELECT * FROM get_stuff('hello', 'col2', 100);
En utilisant RETURN QUERY EXECUTE, les résultats de la requête SQL construite sont renvoyés en un seul lot. quote_ident protège contre l'injection SQL en échappant aux identifiants. Les paramètres sont transmis via USING pour éviter l'injection SQL et les problèmes potentiels de conversion/citation.
Pour des requêtes plus complexes, envisagez d'utiliser la fonction format().
Bien que les fonctions SQL puissent convenir à des opérations simples , PL/pgSQL offre une plus grande flexibilité et des capacités d'optimisation lors de la gestion des clauses ORDER BY et LIMIT paramétrées dans les fonctions de table.
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!