Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/02/2012, 10h45   #1
Invité de passage
 
Femme mathilde
Développeur décisionnel
Inscription : février 2012
Messages : 4
Détails du profil
Informations personnelles :
Nom : Femme mathilde
Localisation : Suisse

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

Informations forums :
Inscription : février 2012
Messages : 4
Points : 0
Points : 0
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 :
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 :
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.
mathilde_1180 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 11h40   #2
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 793
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

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

Informations forums :
Inscription : avril 2009
Messages : 1 793
Points : 4 014
Points : 4 014
Quelle est la question ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 12h29   #3
Invité de passage
 
Femme mathilde
Développeur décisionnel
Inscription : février 2012
Messages : 4
Détails du profil
Informations personnelles :
Nom : Femme mathilde
Localisation : Suisse

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

Informations forums :
Inscription : février 2012
Messages : 4
Points : 0
Points : 0
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 :
ERROR: ORACLE execute error: ORA-00900: invalid SQL statement.
Merci d'avance.
Mathilde.
mathilde_1180 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 13h39   #4
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
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 :
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;
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 14h26   #5
Invité de passage
 
Femme mathilde
Développeur décisionnel
Inscription : février 2012
Messages : 4
Détails du profil
Informations personnelles :
Nom : Femme mathilde
Localisation : Suisse

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

Informations forums :
Inscription : février 2012
Messages : 4
Points : 0
Points : 0
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.
mathilde_1180 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 14h36   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Pourquoi tu veux utiliser des variables oracle?
Tu as pensé à utiliser des macro variables SAS.
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 14h38   #7
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Le fait d'utiliser une macro variable SAS ne dégradera pas les performances.
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 18h19   #8
Invité de passage
 
Femme mathilde
Développeur décisionnel
Inscription : février 2012
Messages : 4
Détails du profil
Informations personnelles :
Nom : Femme mathilde
Localisation : Suisse

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

Informations forums :
Inscription : février 2012
Messages : 4
Points : 0
Points : 0
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.
mathilde_1180 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 20h41   #9
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 793
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

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

Informations forums :
Inscription : avril 2009
Messages : 1 793
Points : 4 014
Points : 4 014
le mieux serait d'appeler une procédure stockée Oracle qui contient les dates en paramètres.
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 21h50   #10
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 014
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 014
Points : 1 722
Points : 1 722
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.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 12h14   #11
Membre expérimenté
 
Inscription : avril 2009
Messages : 538
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 538
Points : 541
Points : 541
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 :
1
2
 
%let madate = to_date('18/03/2012', 'DD/MM/YYYY');
X
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 13h33   #12
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 014
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 014
Points : 1 722
Points : 1 722
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.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 14h23   #13
Membre expérimenté
 
Inscription : avril 2009
Messages : 538
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 538
Points : 541
Points : 541
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.
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 14h42   #14
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 014
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 014
Points : 1 722
Points : 1 722
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?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 14h52   #15
Membre expérimenté
 
Inscription : avril 2009
Messages : 538
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 538
Points : 541
Points : 541
OK pour le retour...

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

Citation:
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
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 14h59   #16
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 793
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

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

Informations forums :
Inscription : avril 2009
Messages : 1 793
Points : 4 014
Points : 4 014
Citation:
Mais comment rappatrier les résultats de ces procédures stockées Oracle dans SAS?
Ca c'est simple :

Code :
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;
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 15h07   #17
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 014
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 014
Points : 1 722
Points : 1 722
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).
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 15h10   #18
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 014
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 014
Points : 1 722
Points : 1 722
Citation:
Envoyé par datametric Voir le message
Ca c'est simple :

Code :
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 ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 15h18   #19
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 793
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

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

Informations forums :
Inscription : avril 2009
Messages : 1 793
Points : 4 014
Points : 4 014
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.
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 15h23   #20
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 014
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 014
Points : 1 722
Points : 1 722
PK donc une procédure? une proc sql pass trouth + PL ou transact /SQL ne devra pas suffire ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h20.


 
 
 
 
Partenaires

Hébergement Web