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

SAS Base Discussion :

Définir une fonction que l'on peut appeler dans une PROC SQL


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Définir une fonction que l'on peut appeler dans une PROC SQL
    Bonjour,

    existe-t-il un moyen dans SAS 9.2 de définir une fonction que l'on peut appeler à l'intérieur d'une PROC SQL ?

    Il est possible de créer une fonction avec la PROC FCMP, et de l'utiliser dans un data step; par contre, la même fonction "is not supported in PROC SQL".

    Exemple de ce que je souhaite réaliser avce la proc sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc sql;
    select champ1, champ2, ma_fonction(champ1,champ2) as nouveau_champ
    from donnees;
    L'équivalent avec un data step, réalisable via la PROC FCMP, est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data donnees; 
    set donnees;
    nouveau_champ=ma_fonction(champ1,champ2);
    run;

    Merci.

  2. #2
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    C'est quoi l'intérêt de passer par une fonction pour une tâche aussi simple?
    à moins que ça soit pour ta culture générale

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Sur une application déjà en production, mais qui ne tourne pas sous SAS, je dispose de nombreuses requêtes SQL. Je dois néanmoins faire passer l'applicatif sous SAS.
    Plutôt que d'utiliser le data step, je préfère donc utiliser (quasiment) telles quelles les requêtes existantes, ce qui réduirait les coûts de développement et les risques d'erreurs. En effet, l'exemple que j'ai fourni dans le premier message, d'une requête SQL très simple -courte et une seule jointure-, n'est pas représentatif de la complexité des requêtes que je dois faire basculer d'un applicatif à l'autre, lesquelles peuvent comprendre 10.000 signes et 20 jointures.

  4. #4
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    J'imagine que ce sont des fonctions spécifiques à ton SGBD et qui n'existe pas dans SAS ?

    dans ce cas tu peux faire un sous-Select et copier/coller les requêtes dedans.

    Exemple illustratif avec DB2 mais ca marche avec teradata, oracle etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    proc SQL.
    Connect to DB2 (user= ...);
     
    select * from CONNECTION TO DB2 
    (
    select * from table having max(c) fetch row_number 10
    );
    quit;

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Réponse
    L'applicatif existant bascule sur du 100% SAS.
    Le SGBD actuel ne devant plus être utilisé à la cible, les fonctions définies par voie de développement sur ce SGBD ne pourront plus être utilisées.

    Etat de la réflexion
    Les logiciels mis à ma disposition changent, mais le cahier des charges fonctionnel reste le même. Comme les différents logiciels font a priori grosso modo la même chose (notamment leur langage SQL est proche), l'idée est de reprendre les développements existants et de les basculer le plus simplement possible.
    Je n'ai pas trouvé par moi-même l'équivalent dans SAS de la possibilité offertes par d'autres SGBD de définir ses propres fonctions insérables dans du SQL.
    Si je n'ai pas trouvé, est-ce parce que cela n'existe pas ?
    J'ai en tout cas noté les alternatives :
    -continuer à utiliser un SGBD autre que SAS (mais ce n'est pas le choix du client)
    -utiliser le data step + proc fcmp (inconvénient que les développements s'annoncent fastidieux et en cadrent pas avec les délais prévus)

  6. #6
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    donc c'est bien de fonctions de SGBD dont tu parlais.

    dans ce cas, je crains que tu doives revoir la conception des applicatifs.

    Le chiffrage de ton forfait n'en n'avait pas tenu compte ?

    As-tu des fonctions qui sont réellement spécifiques qui amèneraient une réécriture complexe en SAS ?

  7. #7
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    +1 Datametric
    Je pense que le plus simple serait d'essayer, avec FCMP, de rédévelopper l'équivalent des fonctions natives de ton ancien logiciel et de s'en servir ensuite dans une proc SQL.
    A priori, rien dans la doc ni dans mon expérience n'interdit d'utiliser les fonctions de FCMP dans la proc SQL.

  8. #8
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    +1 Datametric
    Je pense que le plus simple serait d'essayer, avec FCMP, de rédévelopper l'équivalent des fonctions natives de ton ancien logiciel et de s'en servir ensuite dans une proc SQL.
    A priori, rien dans la doc ni dans mon expérience n'interdit d'utiliser les fonctions de FCMP dans la proc SQL.
    Juste un avis personnel ( celà ce veut en aucun cas dire que ce que vous dites est faux).
    Le mieux c'est de ne pas passer par le FCMP, car il faut penser à la maintenance corrective et évolutive. Maintenir une application est sauvant plus difficile que de la créer, surtout s’elle est très mal documentée.

    SAS offre déjà pas mal de fonctions et de procédures. Je ne vois tout de même pas pourquoi il faut en créer de nouvelles sauf si c’est pour compliquer la programmation ou qu’on n’a pas le choix.

  9. #9
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    +1

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    olivier.decourt a écrit
    Je pense que le plus simple serait d'essayer, avec FCMP, de rédévelopper l'équivalent des fonctions natives de ton ancien logiciel et de s'en servir ensuite dans une proc SQL.
    A priori, rien dans la doc ni dans mon expérience n'interdit d'utiliser les fonctions de FCMP dans la proc SQL.
    Mon échec à utiliser, dans une PROC SQL, une fonction créée avec la PROC FCMP, est l'objet de ce fil de discussion.
    Le message d'erreur est "(ma fonction) is not supported in PROC SQL" -la même fonction peut être appelée dans un data step.
    Que faire ? Soit trouver une alternative à la PROC FCMP, soit parvenir à utiliser la PROC FCMP sans générer le message d'erreur ci-dessus.

    A Datametric
    La solution-compromis que j'imagine est un mixte entre PROC SQL et Data Step. C'est à dire que, au lieu d'écrire une seule requête SQL, complexe et contenant plusieurs appels à des fonctions, obtenir le même résultat mais par étapes successives, en utilisant le plus pertinent de la PROC SQL ou du Data Step pour chaque étape. Ainsi, la PROC SQL est utilisée pour reprendre au possible l'existant, et le Data Step, conjointement à la PROC FCMP, est utilisée lorsque c'est nécessaire pour avoir accès aux fonctions.

    A s_a_m
    De mon point de vue, l'utilisation d'une fonction améliore la lisibilité du code (factorisation, décomposition d'un traitement complexe en étapes élémentaires faciles d'accès).

  11. #11
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Bonjour,

    Je pense qu'une fonction fcmp peut fonctionner en étape data et non en SQL, vu qu'une fonction s'applique sur les valeurs de la colonne en SQL alors que la même fonction s'applique sur un enregistrement d'une étape data.

    Exemple :
    La fonction max en sql s'applique sur une colonne alors qu'en étape data elle s'applique sur plusieurs variables de la même observation!!

    Je pense qu'il faut prendre en considération ces éléments si on développe nos proposes fonctions.

    J'espère que c'est clair.

    Cordialement
    Salah

  12. #12
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    J'ai trouvé un exemple dans lequel on définit une fonction avec fcmp et on l'utilise dans une proc SQL.

    http://www.sascommunity.org/wiki/Com...riables_in_SAS

  13. #13
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Citation Envoyé par klopi Voir le message

    A s_a_m
    De mon point de vue, l'utilisation d'une fonction améliore la lisibilité du code (factorisation, décomposition d'un traitement complexe en étapes élémentaires faciles d'accès).

    Ce que je voulais dire, le mieux est d'utiliser ce qui existe déjà comme fonctions et procédures. Et je suis presque certain que ce qu'existe déjà comme fonctions, procédures SAS pourra répondre à 99% à ton besoin (par contre sa dépend de ce que t’as comme modules, solution et architecture et…).
    T’inquiète je ne critique pas ta démarche et je trouve même intelligent le fait de créer ces propres fonctions (mais il faut penser à bien les commenter).

  14. #14
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Citation Envoyé par klopi Voir le message
    Mon échec à utiliser, dans une PROC SQL, une fonction créée avec la PROC FCMP, est l'objet de ce fil de discussion.
    Le message d'erreur est "(ma fonction) is not supported in PROC SQL" -la même fonction peut être appelée dans un data step.
    Que faire ? Soit trouver une alternative à la PROC FCMP, soit parvenir à utiliser la PROC FCMP sans générer le message d'erreur ci-dessus.
    J'en avais bien conscience, et ma question implicite (qui aurait dû être explicite) est : mais que fait donc ta fonction qui n'est pas supporté en SQL ? Elle utilise un numéro d'observation ? Un FIRST ou un LAST ?
    En règle générale, et comme l'exemple proposé par Salah le rappelle, on peut utiliser les fonctions créées par FCMP dans tous les contextes.

    Olivier

  15. #15
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    En règle générale, et comme l'exemple proposé par Salah le rappelle, on peut utiliser les fonctions créées par FCMP dans tous les contextes.
    En 9.2

    mais que fait donc ta fonction qui n'est pas supporté en SQL ? Elle utilise un numéro d'observation ? Un FIRST ou un LAST ?
    Cf. ma réponse plus haut. Ce sont des fonctions du SGBD et non du SQL "générique"

  16. #16
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Bonjour,

    Est ce que c'est possible de nous donner un exemple de fonction, cela nous permettra de trouver des solutions...?

    Cordialement
    Salah

  17. #17
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Citation Envoyé par datametric Voir le message
    Cf. ma réponse plus haut. Ce sont des fonctions du SGBD et non du SQL "générique"
    Stéphane, pas uniquement ! Puisque Klopi a déjà fait des essais et qu'il nous dit que
    Le message d'erreur est "(ma fonction) is not supported in PROC SQL" -la même fonction peut être appelée dans un data step.
    Comme dit Salah, effectivement, on veut savoir ce que fait/font cette/ces mystérieuse(s) fonction(s) pour réfléchir à des solutions.

    Et en 9.2 effectivement, puisque Klopi a pu tester avec succès dans une étape Data (en 9.1 on est plus ou moins cantonné aux procs FCMP et MODEL).

  18. #18
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Solution en synthèse

    Une fonction créée avec la PROC FCMP ne réagit pas de la même façon aux conversions implicites des paramètres, lorsqu'elle est employée dans une PROC SQL ou dans un Data Step. Appelée dans une PROC SQL, elle génère une erreur, mais pas dans le Data Step.
    Ainsi, après rectification de la fonction que j'avais initialement écrite, cette fonction est utilisée avec succès dans une proc SQL.
    Merci pour vos contributions.


    Cheminement

    Merci bahraoui pour ton lien, contenant un exemple d'utilisation de la PROC FCMP avec une PROC SQL. Dans cet exemple, la fonction créée accepte en paramètres des champs d'une table présente dans la clause from, comprend des branchements conditionnels et des boucles.

    Comme les fonctions que je souhaite créer ont ce même niveau de complexité, mais rien de plus, il devient clair que le message d'erreur que j'obtiens tient intégralement à des spécificités anecdotiques de ma fonction.

    J'ai donc cherché à déterminer quelle est cette spécificité, en la mettant en évidence sur des fonctions simplifiées. Voici le résultat obtenu :

    La fonction Simplissime ci-dessous produit le résultat escompté dans un data simple, générant toutefois la note suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NOTE: Character values have been converted to numeric
    Cette même fonction échoue cependant dans une PROC SQL, avec les deux messages d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERROR: Function SIMPLISSIME requires a numeric expression as argument 1.
    ERROR: The SIMPLISSIME function is not supported in PROC SQL, it is only valid within the DATA step.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    options cmplib=work.fonctions;
    proc fcmp outlib=work.fonctions.fct;
       function simplissime(param);
          return(param);
       endsub;
    run;
    data work.x;
       infile datalines;
       length x $1.;
       input x;
       datalines;
       1
       2
       ;
    run;
    data work.y_data;
       set work.x;
       y=simplissime(x);
    run;
    proc sql;
    create table work.y_sql as
    select x, simplissime(x) as y
    from work.x;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 30/04/2015, 16h07
  2. Réponses: 1
    Dernier message: 27/03/2012, 17h14
  3. tableau a 2 dimentions appelé dans une fonction
    Par epeichette dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 22/10/2007, 15h38
  4. Réponses: 2
    Dernier message: 01/11/2005, 18h47
  5. Réponses: 7
    Dernier message: 25/10/2005, 15h19

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