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

Développement SQL Server Discussion :

Traduire une UDF récursive


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Avatar de Wachter
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2008
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 404
    Points : 734
    Points
    734
    Par défaut Traduire une UDF récursive
    Bonjour,

    J'ai une fonction utilisateur récursive (plus de 300 lignes) écrite en PL/SQL que je devrais l'implémenter en T-SQL. Cette fonction accède à plusieurs tables volumineuses pour effectuer les calculs nécessaires ; le problème de performances se pose donc. Dans ma table initiale, je dispose de plus de 4 millions de triplets (A, B, C) distincts. Je ne pourrai donc mettre en place cette UDF en T-SQL et l'appeler 4 millions fois ! Je souhaite donc découper les traitements dans des tables temporaires étant donné que la fonction comprend une multitude de branchements conditionnels. Dans les deux blocs principaux, il y a un branchement qui fait un appel récursif avec des valeurs différentes pour les paramètres 3 à 8.

    Auriez-vous une idée sur la manière d'implémenter la partie récursive de la fonction utilisateur ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE FUNCTION XXX_USER.F_MONTANT (A, B, C, 'N', 'N', 'N', 'N', 'N')
    RETURN NUMBER IS
    BEGIN
    IF -- Bloc 1
    ...
        RETURN(F_MONTANT(A, B, C-1, 'O', 'O', 'O', 'O', 'O'));
    ELSE -- Bloc 2
    ...
        RETURN(F_MONTANT(A, B, C-1, 'O', 'O', 'O' 'O', 'O'));
    END IF;
    RETURN (MNT);
    END F_MONTANT;
    /

    Merci d'avance pour vos conseils.
    Code parrain certification Voltaire : NTMPH759

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Le code que tu donnes n'est pas valide en PL/SQL. Tes paramètres ne sont pas typés, et tu ne peux pas déclarer des paramètres en forme de constantes.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Regardez si vous pouvez réécrire la logique récursive avec du code ensembliste, si c'est possible (et c'est souvent le cas) vous n'aurez pas de problèmes de performances. Le conseil aurait été valable sur Oracle également.

  4. #4
    Membre éclairé
    Avatar de Wachter
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2008
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 404
    Points : 734
    Points
    734
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Le code que tu donnes n'est pas valide en PL/SQL. Tes paramètres ne sont pas typés, et tu ne peux pas déclarer des paramètres en forme de constantes.
    Je sais. J'ai volontairement réduit le code de la fonction pour se focaliser sur l'aspect logique de la fonction. J'ai également volontairement initialisé les paramètres à 'N' pour dire que l'appel initial aura des paramètres 'N' et les appels suivants auront comme paramètres 'O'.

    Ce n'est donc pas la question. Tout code récursif peut normalement être traduit en itératif. Là, on manipule des ensembles. Mon souhait est d'éviter la fonction utilisateur récursive en raison des problèmes de performances.
    Code parrain certification Voltaire : NTMPH759

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Je ne me souviens pas avoir écrit une fonction récursive en PL/SQL depuis bien longtemps. Il est certainement probable de pouvoir remplacer son code par des requêtes SQL ensemblistes, d'autant plus qu'il est possible de faire du SQL récursif depuis la version 11g2.
    Mais pour cela il faudrait voir le code complet de la fonction.

Discussions similaires

  1. [MFC]Traduire une appli
    Par annedjomo dans le forum MFC
    Réponses: 4
    Dernier message: 25/01/2006, 10h26
  2. [VB] Organigramme d'une procédure récursive.
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 06/11/2005, 10h53
  3. Comment traduire une requête en XPATH ?
    Par vincent1 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 24/06/2005, 12h46
  4. Pb avec une UDF sur firebird v1.5
    Par jeanafond dans le forum SQL
    Réponses: 7
    Dernier message: 20/05/2005, 17h29
  5. Problème avec une UDF
    Par kanmaber dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/08/2004, 23h42

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