L'exécution de requêtes dynamiquement en PL/pgSQL.

J'ai trouvé des solutions (je crois) pour le problème, je suis sur le point de demander à Oracle et SQL Server, mais n'arrive pas à le traduire dans un Postgres solution. J'utilise Postgres 9.3.6.

L'idée est d'être capable de générer des "métadonnées" sur le contenu de la table à des fins de profilage. Ceci ne peut être fait (à ma connaissance) en ayant les requêtes exécutées pour chaque colonne de manière à savoir, dire... min/max/le comte de valeurs et de ces. Afin d'automatiser la procédure, il est préférable d'avoir les requêtes générées par la DB, puis exécutés.

Avec un exemple salesdata table, je suis en mesure de générer une requête de sélection pour chaque colonne, de retour de la fonction min() valeur à l'aide de l'extrait de code suivant:

SELECT 'SELECT min('||column_name||') as minval_'||column_name||' from salesdata '  
FROM information_schema.columns 
WHERE table_name = 'salesdata'

L'avantage étant que la db va générer le code quel que soit le nombre de colonnes.
Maintenant, il y a une multitude d'endroits où j'avais à l'esprit pour le stockage de ces requêtes, soit une variable quelconque, ou une colonne de table, l'idée étant de faire exécuter ces requêtes.
J'ai pensé à stocker les requêtes générées dans une variable puis de les exécuter à l'aide de la EXECUTE (ou EXECUTE IMMEDIATE) une déclaration qui est l'approche employée ici (voir le volet de droite), mais Postgres ne me permet pas de déclarer une variable en dehors d'une fonction et j'ai été de me gratter la tête à la façon d'ajustement entre eux, que c'est même la direction à suivre, peut-être il y a quelque chose de plus simple.

Avez-vous des pointeurs, je suis en train d'essayer quelque chose de ce genre, inspiré par cette autre question mais n'ai aucune idée si je suis dans la bonne direction:

CREATE OR REPLACE FUNCTION foo()
RETURNS void AS
$$
DECLARE
    dyn_sql text; 
BEGIN            
dyn_sql := SELECT 'SELECT min('||column_name||') from salesdata'    
    FROM information_schema.columns 
    WHERE table_name = 'salesdata';
execute dyn_sql
END
$$ LANGUAGE PLPGSQL;    
  • C'est vraiment pas clair ce que vous essayez de faire. Générer des chaînes de requête pour les sauver? Exécuter des requêtes et d'enregistrer les résultats? Veuillez préciser la tâche. Et, comme toujours, de donner votre version de Postgres, s'il vous plaît.
  • "pour des fins de profilage" --- qu'est-ce exactement que la moyenne?
  • Qu'aimeriez-vous votre fonction de retour? Le minimum de chaque colonne?
  • Il n'y a pas de EXECUTE IMMEDIATE en plpgsql, juste EXECUTE.
  • profilage des données est un moyen d'obtenir une bonne idée de ce qui est dans votre tableau, min/max/moyenne des valeurs, la valeur des fréquences, la valeur de la distribution, comte de valeurs null, etc... c'est un point de départ pour les données d'évaluation de la qualité.
  • J'ai aussi répondu à la question qui vous a inspiré: stackoverflow.com/a/29616496/939860

InformationsquelleAutor EJB | 2015-04-13