Greenplum prend-il en charge le SQL dynamique ?
-
29-09-2020 - |
Question
PostgreSQL implémente le execute ... using
option pour transmettre des paramètres dans SQL dynamique, et pour autant que je sache, cette fonctionnalité a été introduite dans la version 8.4.Nous utilisons Greenplum, qui est un dérivé de PostgreSQL en version 8.2, il n'a donc pas cette fonctionnalité.
Existe-t-il un autre moyen de faire la même chose dans Greenplum ou PostgreSQL 8.2 ?
La solution
Je ne peux pas le dire avec certitude, mais il y a un indice dans le CREATE FUNCTION
Documentation:
nom de langue Nom de la langue dans laquelle la fonction est implémentée.Peut être SQL, C, interne ou le nom d'un langage procédural défini par l'utilisateur.Voir CREATE LANGUAGE pour les langages procéduraux pris en charge dans la base de données Greenplum.
À son tour, le lieu référencé indique
Le langage PL/pgSQL est installé par défaut dans la base de données Greenplum.
Maintenant le EXECUTE ... USING
est une fonctionnalité PL/pgSQL, donc la seule question est de savoir de quelle version de PostgreSQL elle provient.La documentation pointe vers 8.2 - et de cette façon, il semble que vous n'ayez pas de chance.
J'ai contacté le support Greenplum pour obtenir une réponse définitive, mais je n'ai jamais obtenu de réponse.
Quant à contourner l’absence de cette construction, vous pouvez évidemment concaténer n’importe quelle chaîne SQL de votre choix et l’exécuter.Veillez à citer correctement les valeurs transmises et évitez l'injection SQL.
Autres conseils
Vous pouvez utiliser une solution de contournement en utilisant une fonction stockée mentionnée par dezso :
CREATE OR REPLACE FUNCTION dynamic_query (table_name TEXT) RETURNS VOID AS $$
BEGIN
EXECUTE 'SELECT * FROM ' || table_name || ' WHERE column1 LIKE ''a_value''';
END;
$$ language plpgsql;