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 :

Intégration de scripts oracle dans SAS


Sujet :

SAS Base

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Finance

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Intégration de scripts oracle dans SAS
    Bonjour,

    Je souhaite exécuter une requête oracle en utilisant des variables oracle pour des soucis de performance.

    Code SAS d'origine (les dates sont des macro variables SAS) :

    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
    proc sql;
    connect to oracle(user=xxx orapw=xxx path=xxx);
    create table TMP_CALENDAR as 
    select * from connection to oracle ( 
    select 
    CAL.CDDATE, 
    upper(TYPE.SHORTNAME) as TYPE 
    from 
    CALENDAR_DATE CAL, 
    CALENDAR TYPE 
    where 
    CAL.CALENDAR = TYPE.TID 
    and ( CAL.VPCREATIONDATE <= to_date('25JAN2012:09:24:16','DDMONYYYY:HH24:MI:SS') ) 
    and ( CAL.VPLASTUPDATE is null or CAL.VPLASTUPDATE >= to_date('25JAN2012:09:24:16','DDMONYYYY:HH24:MI:SS') ) 
    and ( CAL.VPSTARTDATE is null or CAL.VPSTARTDATE <= to_date('15Nov2011:00:00:00','DDMONYYYY:HH24:MI:SS') ) 
    and ( CAL.VPENDDATE is NULL or to_date('15Nov2011:00:00:00','DDMONYYYY:HH24:MI:SS') < CAL.VPENDDATE)
    and ( TYPE.VPCREATIONDATE <= to_date('25JAN2012:09:24:16','DDMONYYYY:HH24:MI:SS') ) 
    and ( TYPE.VPLASTUPDATE is null or TYPE.VPLASTUPDATE >= to_date('25JAN2012:09:24:16','DDMONYYYY:HH24:MI:SS') ) 
    and ( TYPE.VPSTARTDATE is null or TYPE.VPSTARTDATE <= to_date('15Nov2011:00:00:00','DDMONYYYY:HH24:MI:SS') ) 
    and ( TYPE.VPENDDATE is NULL or to_date('15Nov2011:00:00:00','DDMONYYYY:HH24:MI:SS') < TYPE.VPENDDATE)
    );
    disconnect from oracle;
    quit;
    Code oracle à intégrer dans SAS (les dates deviennent des variables oracle) :

    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
    VARIABLE date1 VARCHAR2(20);
    VARIABLE date2 VARCHAR2(20);
    exec :date1 :=  '25JAN2012:09:24:16' ;    
    exec :date2 :=  '15Nov2011:00:00:00' ;
    select 
    CAL.CDDATE, 
    upper(TYPE.SHORTNAME) as TYPE 
    from 
    CALENDAR_DATE CAL, 
    CALENDAR TYPE 
    where 
    CAL.CALENDAR = TYPE.TID 
    and ( CAL.VPCREATIONDATE <= to_date(:date1,'DDMONYYYY:HH24:MI:SS') ) 
    and ( CAL.VPLASTUPDATE is null or CAL.VPLASTUPDATE >= to_date(:date1,'DDMONYYYY:HH24:MI:SS') ) 
    and ( CAL.VPSTARTDATE is null or CAL.VPSTARTDATE <= to_date(:date2,'DDMONYYYY:HH24:MI:SS') ) 
    and ( CAL.VPENDDATE is NULL or to_date(:date2,'DDMONYYYY:HH24:MI:SS') < CAL.VPENDDATE)
    and ( TYPE.VPCREATIONDATE <= to_date(:date1,'DDMONYYYY:HH24:MI:SS') ) 
    and ( TYPE.VPLASTUPDATE is null or TYPE.VPLASTUPDATE >= to_date(:date1,'DDMONYYYY:HH24:MI:SS') ) 
    and ( TYPE.VPSTARTDATE is null or TYPE.VPSTARTDATE <= to_date(:date2,'DDMONYYYY:HH24:MI:SS') ) 
    and ( TYPE.VPENDDATE is NULL or to_date(:date2,'DDMONYYYY:HH24:MI:SS') < TYPE.VPENDDATE)
    Merci d'avance pour votre aide.

    Cordialement,
    Mathilde.

  2. #2
    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 : 52
    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
    Quelle est la question ?

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Finance

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    la question est :
    Comment intégrer le code Oracle dans une proc sql de sas ?
    J'ai essayé avec execute() by oracle ; mais ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR: ORACLE execute error: ORA-00900: invalid SQL statement.
    Merci d'avance.
    Mathilde.

  4. #4
    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
    http://support.sas.com/techsup/technote/ts566d.pdf
    Tu as essayer de faire une requête simple?
    Pour essayer de savoir si ce sont les dates qui pose le problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    proc sql;
    connect to oracle(user=xxx orapw=xxx path=xxx);
    create table TMP_CALENDAR as
    select * from connection to oracle (
    	select count(*)
    	from CALENDAR_DATE CAL
    );
    disconnect from oracle;
    quit;

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Finance

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    oui le premier code marche (même avec les dates).
    Ce que je n'arrive pas à faire c'est utiliser des variables oracle au lieu des variables sas dans la requete.

  6. #6
    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
    Pourquoi tu veux utiliser des variables oracle?
    Tu as pensé à utiliser des macro variables SAS.

  7. #7
    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
    Le fait d'utiliser une macro variable SAS ne dégradera pas les performances.

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Finance

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Si justement, ça dégrade les performance au niveau de Oracle. Nous avons fait des tests et on gagne 80% de temps en utilisant des bind variables dans Oracle au lieu d'utiliser des constantes. En fait, à l'origine, on utilisait des macro variables sas mais elles sont interprétées par SAS avant que la requête soit envoyée à Oracle, donc c'est comme si on utilisait des constantes pour oracle.

  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 : 52
    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
    le mieux serait d'appeler une procédure stockée Oracle qui contient les dates en paramètres.

  10. #10
    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 mathilde_1180 Voir le message
    Si justement, ça dégrade les performance au niveau de Oracle. Nous avons fait des tests et on gagne 80% de temps en utilisant des bind variables dans Oracle au lieu d'utiliser des constantes. En fait, à l'origine, on utilisait des macro variables sas mais elles sont interprétées par SAS avant que la requête soit envoyée à Oracle, donc c'est comme si on utilisait des constantes pour oracle.
    Hello;
    Les Bind variables sont des objets Oracles que SAS ne connait pas.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    je n'arrive pas a croire que un bind oracle marche mieux qu'un to_date

    rien ne t'empeche de stocker dans ta macro-variable un to_date:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    %let madate = to_date('18/03/2012', 'DD/MM/YYYY');
    X

  12. #12
    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
    to_date est une fonction et les binde variables sont des applications utilisées pour optimiser les traitements , en gros c'est pour éviter que le moteur Oracle fait un parse de la requette pour chercher le bon plan d'execution à chaque exécution de la requête et c'est ce qui permet d'optimiser les traitements.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    oui pour du PL/SQL on gagne mais une pauvre requête cela ne doit pas être cela qui impacte les temps de traitements.

    sauf si la requête est rejouée très très souvent, alors là je rejoindrais plutôt la réponse procédure stockée.

  14. #14
    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
    OUI OUI ... procédure stocke , package ou autre choses... avec la commande execute.
    Mais comment rappatrier les résultats de ces procédures stockées Oracle dans SAS?

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    OK pour le retour...

    mais j'aimerais savoir quelle est la procédure de test qui a permis de conclure que :
    on gagne 80% de temps en utilisant des bind variables dans Oracle
    surtout par rapport aux to_date mentionnés, tu mets que :

    en gros c'est pour éviter que le moteur Oracle fait un parse de la requette pour chercher le bon plan d'execution à chaque exécution de la requête et c'est ce qui permet d'optimiser les traitements.
    je penche donc plutot du coté du design de la base, que l'optimiser est perdu a cause de mauvaises statistiques.

    il est déconseillé de ne plus utiliser les requêtes qui forcent l'optimiser (hints) (depuis 10g je crois)

    X

  16. #16
    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 : 52
    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
    Mais comment rappatrier les résultats de ces procédures stockées Oracle dans SAS?
    Ca c'est simple :

    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
    proc sql;
     
    connect to odbc as dblink ("driver=SQL Server; server=chezMoi; database=Maison; owner=DBO;");
     
          create table test1 as
     
          select *
     
    from connection to dblink
     
          (execute CheckQuantityUnits 'H2', 208, 2010, 2009 );
     
    disconnect from dblink;
     
    quit;

  17. #17
    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 xav2229 Voir le message
    OK pour le retour...

    mais j'aimerais savoir quelle est la procédure de test qui a permis de conclure que :


    surtout par rapport aux to_date mentionnés, tu mets que :

    X
    Je ne parlais pas de to_date mais de l'utilité de l'utilisation de variables BIND.

    Citation Envoyé par xav2229 Voir le message

    je penche donc plutot du coté du design de la base, que l'optimiser est perdu a cause de mauvaises statistiques.

    il est déconseillé de ne plus utiliser les requêtes qui forcent l'optimiser (hints) (depuis 10g je crois)

    X
    Je crois que cette question il faut plutôt la poser à mathilde_1180. qui évoque la problèmatoque des bind et leurs utilisations... Tout depend de leurs contexte...
    Et oui Oracle déconseille d'utiliser les BIND (à lire sur leurs site).

  18. #18
    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 datametric Voir le message
    Ca c'est simple :

    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
    proc sql;
     
    connect to odbc as dblink ("driver=SQL Server; server=chezMoi; database=Maison; owner=DBO;");
     
          create table test1 as
     
          select *
     
    from connection to dblink
     
          (execute CheckQuantityUnits 'H2', 208, 2010, 2009 );
     
    disconnect from dblink;
     
    quit;
    Les procédures que je developpe en générale alimentent ou traitent plusieurs tables ( dans la même procédure). Penses-tu que je pourrai utiliser le code que tu proposes dans ce cas ?

  19. #19
    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 : 52
    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
    Tu as vu dans mon exemple que je récupère le résultat de la requête. Tu ne sais donc pas que ma procédure fait une jointure de x tables.
    Donc si ta procédure fait des INSERT INTO et que tu renvoies un résultat ( un RC ) je pense que SAS peut l'exécuter.
    L'idée est quand même d'exécuter une procédure pour rapatrier quelque chose. Pour une autre utilisation il faut tester.

  20. #20
    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
    PK donc une procédure? une proc sql pass trouth + PL ou transact /SQL ne devra pas suffire ?

Discussions similaires

  1. [Spip] Intégration d'un script PHP dans un article Spip
    Par Devs+ dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 19/11/2008, 12h36
  2. Réponses: 2
    Dernier message: 25/04/2008, 20h53
  3. Réponses: 2
    Dernier message: 16/11/2007, 15h16
  4. Réponses: 22
    Dernier message: 14/03/2007, 18h30
  5. [XML->ORACLE] intégration de fichiers xml dans oracle
    Par bastouffe dans le forum Oracle
    Réponses: 2
    Dernier message: 15/11/2006, 15h58

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