IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Appeler une fonction en SQL Dynamique et passer un tableau


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Appeler une fonction en SQL Dynamique et passer un tableau
    Bonjour à tous,

    J'ai un type complexe, et une série de fonction qui s'exécutent les unes après les autres en passant ce tableau et en renvoyant ce tableau après l'avoir filtré selon une règle métier. Cela me fait une espèce de "workflow". Désormais, j'aimerais stocker les étapes dans une table à part et exécuter ce workflow à partir de celle-ci.

    Le but étant de pouvoir paramétrer les étapes. Voici à quoi ça ressemble sans dynamisme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE FUNCTION se_test(arg_from DATE, arg_to DATE, arg_subprograms TEXT[])
        RETURNS SETOF SE_RESULT
    AS $$
    DECLARE prev_result SE_RESULT[];
    BEGIN
        prev_result := ARRAY(SELECT ROW(pp_id, se_id, presencestatus) FROM se_1(arg_from, arg_to, arg_subprograms));
        prev_result := ARRAY(SELECT ROW(pp_id, se_id, presencestatus) FROM se_2(arg_from, arg_to, arg_subprograms, prev_result));
        prev_result := ARRAY(SELECT ROW(pp_id, se_id, presencestatus) FROM se_3(arg_from, arg_to, arg_subprograms, prev_result));
        prev_result := ARRAY(SELECT ROW(pp_id, se_id, presencestatus) FROM se_4(arg_from, arg_to, arg_subprograms, prev_result));
        RETURN QUERY
            SELECT * FROM UNNEST(prev_result);
    END;
    $$ LANGUAGE 'plpgsql';
    Et le workflow se retrouverait suite à une requête du style select f_name from workflow order by pos, reste plus qu'à exécuter les différents f_name renvoyés, qui ont toutes la même signature : arg_from DATE, arg_to DATE, arg_subprograms TEXT[], arg_base SE_RESULT[] DEFAULT NULL.

    J'ai déjà fait du SQL Dynamique avec EXECUTE 'SELECT truc FROM ' || arg_ma_table || ' WHERE col = ' || arg_x des trucs comme ça mais là il s'agit de passer des tableaux (arg_subprograms et prev_result) qui peuvent contenir beaucoup de données.

    Alors je pense que ce n'est pas adapté de faire comme ça, mais je vous pose la question par acquit de conscience. Auquel cas auriez-vous une astuce pour se faire ?

    Merci à vous,

    A bientôt

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 539
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 539
    Par défaut
    bonsoir vite fait bien fait si les arguments passés sont de type LONGBLOB par exemple ça risque de ne pas marcher c'est certain.
    Donc chercher dans la doc de PostGreSQL comment passer un pointeur de tableau

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    1 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 045
    Par défaut
    Bonjour,

    Je n'ai pas très bien compris où tu voulais en venir.

    Tu définis une fonction se_test et dans tes requêtes on voit apparaître des se_1, se_2...

    Pourrais poster une définition de la table d'origine, un jeu de données pour test et le résultat attendu ?

Discussions similaires

  1. Appeler une fonction pl/sql dans vb6
    Par pupucette dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/06/2012, 16h55
  2. Réponses: 7
    Dernier message: 15/02/2009, 23h01
  3. Réponses: 0
    Dernier message: 27/11/2007, 17h17
  4. problème appel à une fonction pl/sql
    Par tommey dans le forum Langage
    Réponses: 3
    Dernier message: 07/08/2007, 14h19
  5. Comment appeller une fonction dynamiquement, à partir d'un argument
    Par Invité dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/04/2006, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo