SAS/ACCESS® to Oracle
FAQs
- Est-il possible d'afficher dans une même bibliothèque les données provenant de plusieurs bibliothèques SAS ? Réponse
- Lors de l'accès à une base Oracle, le message d'erreur suivant s'affiche dans la log :
libname tabora oracle user=scott orapw=tiger path="ABCD";
ERROR: ORACLE connection error: ORA-12154: TNS:could not resolve service name.
ERROR: Error in the LIBNAME statement.
Réponse - Pourquoi une bibliothèque accédant à des données Oracle (utilisant le moteur Oracle) n'affiche pas les synonymes ? Réponse
- Lors de l'accès à une base Oracle (SAS et Oracle sous Unix), le message d'erreur suivant s'affiche dans la log :
Could not load /local/applis/sas82/sasexe/sasora (9 images loaded)
Error: ld.so.1: sas82: fatal: libclntsh.so.8.0: open failed: No such file or directory
ou
Error : usr/lib/dld.sl cannot find path for shared library libclntsh.sl.8.0
Réponse - Quelle est la raison des messages d'erreur ci-dessous, lors d'un accès à Oracle depuis SAS :
Could not load /logiciels/sas/sas9.1.3/sasexe/sasora (60 images loaded)
Error: ld.so.1: /logiciels/sas/sas9.1.3/sasexe/sas: fatal:
/logiciels/oracle/ora_8.1.7/lib/libclntsh.so.8.0:
wrong ELF class: ELFCLASS32
Réponse - Comment utiliser les "hint" (indicateurs d'optimisation) Oracle à partir de SAS ? Réponse
- Comment vérifier l'existence d'une table Oracle depuis SAS ? Réponse
- Comment visualiser les tables disponibles pour un utilisateur donné ? Réponse
- Lors de l'accès à des bases Oracles via une connexion à un object spawner, les variables d'environnement Unix déclarées dans le fichier « .profile » ne sont pas prises en compte par SAS. Réponse
- Lors de l’import d’une table Oracle dans SAS, est-il possible d’utiliser les commentaires d’une variable Oracle en tant que nom de variable ou libellé dans SAS ? Réponse
- Comment passer les commandes 'HINTS' à Oracle ? Réponse
- Comment modifier les paramètres NLS d’une session ORACLE depuis SAS ? Réponse
- Comment résoudre les problèmes d'affichage des accents dans les données récupérées d'une table Oracle ? Réponse
Réponses
- Catégories : SAS/Access to Oracle
- OS : Windows, Unix, z/OS
- Version : 9.3 et au-delà
- Vérifié en décembre 2013
Est-il possible d'afficher dans une même bibliothèque les données provenant de plusieurs bibliothèques SAS ?
Oui grâce à la fonction d’agrégation des bibliothèques SAS :
libname mylib (lib1,lib2,lib3);
La force de cette fonctionnalité est de permettre de faciliter les jointures entre des tables qui sont sur une base de données distante (Oracle, SQL Server…) mais dans des schemas différents.
Exemple :
libname t1 oracle user=system password=oracle schema=scott path=aix01;
libname t2 oracle user=system password=oracle schema=dwh path=aix01;
libname t3 oracle user=system password=oracle schema=reporting path=aix01;
libname compil (t1,t2,t3);
Log SAS :
libname compil (t1,t2,t3);
NOTE: Libref COMPIL was successfully assigned as follows:
Levels: 3
Engine(1): ORACLE
Physical Name(1): aix01
Engine(2): ORACLE
Physical Name(2): aix01
Engine(3): ORACLE
Physical Name(3): aix01
libname compil list;
NOTE: Libref= COMPIL
Scope= DMS Process
Levels= 3
-Level 1-
Engine= ORACLE
Physical Name= aix01
Schema/User= scott
-Level 2-
Engine= ORACLE
Physical Name= aix01
Schema/User= dwh
-Level 3-
Engine= ORACLE
Physical Name= aix01
Schema/User= reporting
Ainsi, les tables Oracle des 3 bibliothèques ci-dessus sont accessibles depuis l’unique bibliothèque « compil ».
Si les bibliothèques membres de la bibliothèque « compil » possèdent les mêmes paramètres :
- User
- Password
- Path
mais que seul le paramètre « schema » diffère, alors Oracle peut exécuter les jointures en base et non pas dans la WORK de SAS, ce qui permet un gain de performances important.
Lors de l'accès à une base Oracle, le message d'erreur suivant s'affiche dans la log :
libname tabora oracle user=scott orapw=tiger path="ABCD";
ERROR: ORACLE connection error: ORA-12154: TNS:could not resolve service name.
ERROR: Error in the LIBNAME statement.
Cette erreur indique généralement que le nom de l'instance Oracle ou l'alias créé au niveau du client Oracle (client utilisé pour la connexion à la Base) est incorrect.
La valeur ABCD de l'option « path » définit cette instance ou cet alias.
NB : La description de l'instance ou de l'alias se trouve dans le fichier de configuration Oracle nommé tnsnames.ora.
- Catégories : SAS/Access to Oracle
- OS : Unix, Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en Mars 2010
Pourquoi une bibliothèque accédant à des données Oracle (utilisant le moteur Oracle) n'affiche pas les synonymes ?
Pour afficher les synonymes Oracle il faut utiliser au niveau de l'instruction « LIBNAME » l'option SHOW_SYNONYMS=YES.
libname ora1 oracle user=scott orapw=tiger show_synonyms=YES;
Attention : avec cette option, la bibliothèque SAS ne contiendra que les synonymes. Pour avoir l'ensemble des objets, il faut concaténer une bibliothèque (allocation classique n'affichant que les tables et les vues) avec la bibliothèque créée ci-dessus.
La concaténation s'effectue avec l'instruction suivante :
Libname ora (ora1 ora2) ;
- Catégories : SAS/Access to Oracle
- OS : Unix, Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en Mars 2010
Lors de l'accès à une base Oracle (SAS et Oracle sous Unix), le message d'erreur suivant s'affiche dans la log :
Could not load /local/applis/sas82/sasexe/sasora (9 images loaded)
Error: ld.so.1: sas82: fatal: libclntsh.so.8.0: open failed: No such file or directory
ou
Error : usr/lib/dld.sl cannot find path for shared library libclntsh.sl.8.0
Pour accéder à une base de données Oracle (quand SAS est installé sur un Serveur Unix), il faut déclarer une variable d'environnement qui pointe sur la bibliothèque Oracle.
AIX : export LIBPATH=$ORACLE_HOME/lib:$LIBPATH
Intel ABI, Compaq Tru64, IRIX et Linux :
export LD_LIBRARY_PATH=/usr/ucblib:$ORACLE_HOME/lib:$LD_LIBRARY_PATH
HPUX : export SHLIB_PATH=$ORACLE_HOME/lib:$SHLIB_PATH
Solaris : export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/ucblib:$LD_LIBRARY_PATH
Attention : Une application 32 bits (comme SAS 8.2) doit accéder à une bibliothèque Oracle 32 bits. SAS 9 (9.1, 9.1.2, 9.1.3) est une application 64 bits et donc doit accéder à des bibliothèques Oracle 64 bits.
- Catégories : SAS/Access to Oracle
- OS : Unix, Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en Mars 2010
Quelle est la raison des messages d'erreur ci-dessous, lors d'un accès à Oracle depuis SAS :
Could not load /logiciels/sas/sas9.1.3/sasexe/sasora (60 images loaded)
Error: ld.so.1: /logiciels/sas/sas9.1.3/sasexe/sas: fatal:
/logiciels/oracle/ora_8.1.7/lib/libclntsh.so.8.0:
wrong ELF class: ELFCLASS32
Ces messages sont dus à une différence dans le mode d'adressage entre SAS et Oracle. En effet, il faut que SAS et le client Oracle utilisent tous les deux le mode 32 bits, ou le mode 64 bits.
En cas de doute, la commande « file » permet de contrôler les versions des modules exécutables.
Voici des exemples de résultats sur le module « sas » et sur la bibliothèque « libclntsh.so.9.0 » d'Oracle :
bash-2.03# file sasexe/sas
sasexe/sas: ELF 64-bit MSB executable SPARCV9 Version 1, UltraSPARC1 Extensions Required, dynamically linked, not stripped
/local/applis/oracle/oracle9i/lib>file libclntsh.so.9.0
libclntsh.so.9.0: ELF 64-bit MSB dynamic lib SPARCV9 Version 1, dynamically linked, not stripped
/local/applis/oracle/oracle9i/lib32>file libclntsh.so.9.0
libclntsh.so.9.0: ELF 32-bit MSB dynamic lib SPARC Version 1, dynamically linked, not stripped
- Catégories : SAS/Access to Oracle
- OS : Unix, Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en Mars 2010
Comment utiliser les "hint" (indicateurs d'optimisation) Oracle à partir de SAS ?
Il est possible d'utiliser les « hint » Oracle à partir de SAS à l'aide d'une Proc Sql Passthrough avec une instruction « execute ».
Vous devez employer la fonction %str() pour les caractères spéciaux comme « * » ou « / ».
Exemple :
execute( delete %str(/)%str(*)+ INDEX(A) %str(/)%str(*) from SIAW_TB_DEMH A
where exists
( select * from TMP_DEMH_NCLEDEMH B
where A.DEMH_NCLEDEMH =
B.DEMH_NCLEDEMH ) ) by oracle;
- Catégories : SAS/Access to Oracle
- OS : Unix, Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en Mars 2010
Comment vérifier l'existence d'une table Oracle depuis SAS ?
Voici un exemple de macro programme qui permet de vérifier depuis SAS si une table Oracle existe. On utilise ici le SQL Pass-through explicite. Les différents paramètres de connexion doivent être saisis en tant que paramètres du macro programme.
%macro tabexist(user,pw,alias,table,schema);
%let tabname=not_there;
proc sql;
connect to oracle (user=&user orapw=&pw path=&alias schema=&schema);
select tabname into :tabname from connection to oracle
(select table_name as tabname from all_tables where table_name=&table);
disconnect from oracle;
quit;
%if &tabname=not_there %then %put The Table does not exist;
%else %put The Table name is &tabname;
%mend tabexist;
% tabexist (scott,tiger,base,'TABLE',test);
Aide en ligne : Overview of the Pass-Through Facility, Pass-Through Facility Specifics for Oracle
- Catégories : SAS/Access to Oracle
- OS : Unix, Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en Mars 2010
Comment visualiser les tables disponibles pour un utilisateur donné ?
Dans l'exemple ci-dessous, nous souhaitons lister les tables accessibles par Scott dans le schéma « test » :
libname Orasas oracle user=scott pw=tiger path='base' schema=test;
proc sql;
Select table_name from orasas.USER_TABLES ;
run;
Aide en ligne : SAS/ACCESS(R) 9.2 for Relational Databases: Reference, Second Edition
- Catégories : SAS/Access to Oracle
- OS : Unix, Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en Mars 2010
Lors de l'accès à des bases Oracles via une connexion à un object spawner, les variables d'environnement Unix déclarées dans le fichier « .profile » ne sont pas prises en compte par SAS.
Il faut positionner les variables d’environnement dans le fichier !SASROOT/utilities/bin/sasenv_local
Exemple (Solaris):
# Define environment variables required by Oracle
#
export ORACLE_HOME=/chemin/vers/oracle
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/ucblib:$LD_LIBRARY_PATH
Aide en ligne :
Usage Note 30476: System, installation, and configuration requirements for SAS/ACCESS® Interface to Oracle in the UNIX environment
- Catégories : SAS/Access to Oracle
- OS : Unix, Windows
- Version : SAS® 8.2 et au-delà
- Vérifié en Mars 2010
Lors de l’import d’une table Oracle dans SAS, est-il possible d’utiliser les commentaires d’une variable Oracle en tant que nom de variable ou libellé dans SAS ?
Les commentaires d'une variable sont stockés dans le dictionnaire Oracle et SAS n'a pas d'accès à ce dictionnaire. Il n'est donc pas possible de les récupérer sous SAS.
- Catégories : SAS/Access OS : Unix, Windows
- Version : SAS® 9.1.3 et au-delà
- Vérifié en Janvier 2010
Comment passer les commandes 'HINTS' à Oracle ?
Voici deux méthodes pour passer les HINTS à Oracle : Méthode 1 : PROC SQL PASS-THROUGH - PRESERVE_COMMENTS
L'option PRESERVE_COMMENTS peut être utilisée après les options USER= et
PASSWORD=. La requête ORACLE SQL est placée entre parenthèses.
La commande SQL INDX identifie l’indexe utilisé par le composant« ORACLE Optimizer » quand il traite la requête. Plusieurs hints doivent être séparés par un espace.
Voici un exemple d'utilisation de PRESERVE_COMMENTS :
proc sql;
connect to oracle as mycon(user=scott password=tiger preserve_comments);
select *
from connection to mycon
(select /* +indx(empid) all_rows */
count(*) from employees);
quit;
Méthode 2 : ETAPE DATA / PROC - ORHINTS
L'option ORHINTS peut être utilisé avec une étape DATA ou PROC.
Voici un exemple d'utilisation de ORHINTS :
libname mydblib oracle user=testuser password=testpass path='myorapath';
proc print data=mydblib.payroll(orhints='/*+ ALL_ROWS */');
run;
Aide en ligne : Preserve_Comments, Orhints
- Catégories : SAS/Access OS : Unix, Windows
- Version : SAS® 9.1.3 et au-delà
- Vérifié en Janvier 2010
Comment modifier les paramètres NLS d’une session ORACLE depuis SAS ?
Il faut utiliser l'instruction suivante :
ALTER SESSION SET NLS_LANGUAGE=FRENCH"
Elle sera appliqué différemment selon que l'on accède aux données Oracle par du SQL Pass-Trough ou par une bibliothèque.
Méthode 1: SQL PASS-THROUGH
PROC SQL;
CONNECT TO ORACLE (USER=user1 PASSWORD=pw1 PATH="path1");
execute( ALTER SESSION SET NLS_LANGUAGE=FRENCH") BY oracle;
CREATE TABLE SASUSER.MYTAB AS SELECT * FROM CONNECTION TO ORACLE
(SELECT *
FROM TABLE1 );
DISCONNECT FROM ORACLE;
QUIT;
Méthode 2: Bibliothèque avec DBCONINIT
Libname test oracle user=system orapw=oracle dbconinit="alter session set NLS_LANGUAGE=FRENCH";
/* test du changement de la valeur */
proc sql;
select * from test.nls_session_parameters
where parameter='NLS_LANGUAGE';
quit
Aide en ligne : DBCONINIT
- Catégories : SAS/Access OS : Unix, Windows
- Version : SAS® 9.1.3 et au-delà
- Vérifié en Janvier 2010
Comment résoudre les problèmes d'affichage des accents dans les données récupérées d'une table Oracle ?
1. Il faut s’assurer que ces variables d’environnement sont appliquées sur le serveur SAS où se situe le client Oracle :
LANG=fr_FR
NLS_LANG=French_France.we8iso8859p1
2. Il faut que l’option LOCALE soit définie dans le fichier de configuration SAS !SASROOT/sasv9.cfg :
-locale fr_fr
Aide en ligne:
Usage Note 8102: Unable to load national character data in the 128-255 range correctly into Oracle using SAS/ACCESS Interface to Oracle