SAS/ACCESS®
to Oracle
QUESTIONS
- 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'exécution d'une instruction « libname »
utilisant le moteur Oracle en SAS 8.2 sous Unix, vous recevez l’erreur
ci-dessous. Quelle en est la raison ? Réponse
Could not load /applis/sas82/sasexe/sasora (15 images loaded)
Error: 0509-022 Cannot load module /applis/sas82/sasexe/sasora.
0509-150 Dependent module /applis/oracle/product/9.2.0
/lib/libclntsh.a(shr.o) could not be loaded.
0509-103 The module has an invalid magic number.
0509-022 Cannot load module /applis/oracle/product/9.2.0
/lib/libclntsh.a.
0509-150 Dependent module /applis/oracle/product/9.2.0
/lib/libclntsh.a could not be loaded.
ERROR: The SAS/ACCESS Interface to ORACLE cannot be loaded. The SASORA
code appendage could not be loaded.
- 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 nouveau

REPONSES
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.

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) ;

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.

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

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;

Comment
vérifier l’existence d’une table Oracle depuis SAS
?
Voici un exemple de macro procédure qui permet de vérifier
depuis SAS si une table Oracle existe. Les différents paramètres
de connexion doivent être entrés avant l’exécution.
%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);
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;

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 créer un fichier oracle.setup de la forme :
#!/bin/ksh -p
#
#Purpose: Runs DBI setup scripts
# Called by objspawn.cfg file
#
function quoteme { #arg
if [[ $# -gt 1 ]]; then
quoteme="\"$*\""
else
quoteme=$1
fi
echo $quoteme
}
#
# Define environment variables required by Oracle
#
export ORACLE_HOME=/chemin/vers/oracle
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/ucblib:$LD_LIBRARY_PATH
#
# Execute SAS
#
cmd=''
for arg in "$@" ; do
tmp="$(quoteme $arg)";
cmd="$cmd $tmp"
done
eval exec $cmd
Dans le fichier de configuration de l’object spawner, la commande
de démarrage de SAS devient :
sasCommand: /local/applis/sas82/utilities/bin/oracle.setup
/local/applis/sas82/sas -config /local/applis/sas82/sasv8_eg.cfg
run;

Lors
de l'exécution d'une instruction « libname » utilisant
le moteur Oracle en SAS 8.2 sous Unix, vous recevez l’erreur ci-dessous.
Could not load /applis/sas82/sasexe/sasora (15 images loaded)
Error: 0509-022 Cannot load module /applis/sas82/sasexe/sasora.
0509-150 Dependent module /applis/oracle/product/9.2.0
/lib/libclntsh.a(shr.o) could not be loaded.
0509-103 The module has an invalid magic number.
0509-022 Cannot load module /applis/oracle/product/9.2.0
/lib/libclntsh.a.
0509-150 Dependent module /applis/oracle/product/9.2.0
/lib/libclntsh.a could not be loaded.
ERROR: The SAS/ACCESS Interface to ORACLE cannot be loaded. The SASORA
code appendage could not be loaded.
Quelle en est la raison ?
SAS 8.2 est une application en mode 32 bits qui utilise les bibliothèques
Oracle en mode 32 bits. Pour ce faire la variable d’environnement
LIBPATH pour AIX, LD_LIBRARY_PATH sur Solaris ou encore SHLIB_PATH pour
HPUX doit désigner une bibliothèque 32 bits d’Oracle.
NB : Avec les versions 64 bits d'Oracle (9.2, 10g), il existe une bibliothèque
en 64 bits ($ORACLE_HOME/lib) et une autre en 32 bits ($ORACLE_HOME/lib32).
La variable d’environnement doit donc contenir la valeur ORACLE_HOME/lib32.

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.

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:
http://support.sas.com/onlinedoc/913/getDoc/fr/acreldb.hlp/a003113595.htm
ORHINTS :
http://support.sas.com/onlinedoc/913/getDoc/fr/acreldb.hlp/a001371596.htm

Comment modifier les paramètres NLS d’une session ORACLE depuis SAS ?
Méthode 1: PROC SQL PASS-THROUGH
PROC SQL;
/*CONNECTION ORACLE*/
CONNECT TO ORACLE (USER=user1 PASSWORD=pw1 PATH="path1");
execute( ALTER SESSION SET NLS_NUMERIC_CHARACTERS='.,') BY oracle;
CREATE TABLE SASUSER.MYTAB AS SELECT * FROM CONNECTION TO ORACLE
(
SELECT
*
FROM TABLE1
);
DISCONNECT FROM ORACLE;
QUIT;
Méthode 2: Libname avec dbconinit option
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:
http://support.sas.com/onlinedoc/913/getDoc/fr/acreldb.hlp/a001342268.htm

Caractéristiques
: |
 |
 |
- Catégories : SAS/Access
- OS : Unix
- Version : SAS® 9.1.3
|
 |
 |
Comment résoudre les problèmes d’affichage des accents dans les données récupérées d’une table Oracle ?
Voici les 2 points à vérifier :
1. Variables d’environnement sur le serveur SAS où se situe le client Oracle :
-------------------------------------------------------------------------
LANG=fr_FR
NLS_LANG=French_France.we8iso8859p1
-------------------------------------------------------------------------
2. Dans le fichier de configuration SAS : !SASROOT/sasv9.cfg
-------------------------------------------------------------------------
-locale fr_fr
-------------------------------------------------------------------------
Usage Note : http://support.sas.com/kb/8/102.html

|