Lors de la construction de la couche unixODBC 2.3.0 sous Solaris 10 x86 et d'un test de connexion ODBC vers Oracle 11g R2, mauvaise surprise : le pilote natif Oracle libsqora.so.11.1 pour ODBC dans $ORACLE_HOME/lib n'est pas présent.
L'option ODBC a bien été sélectionnée lors de la configuration de l'installation mais la librairie libsqora.so.11.1 n'a pas été construite car la couche unixODBC était manquante lors de l'installation. Pas de panique, il est encore possible de construire cette couche ODBC avec le compte unix oracle sans devoir exécuter à nouveau l'installeur Oracle Universal Installer ou réinstaller la distribution Oracle. Les étapes sont décrites dans cette note.
Il s'agit ici d'une distribution Oracle 11.2.0.2 64 bits installée dans le répertoire /Software/oracle/app/product/11.2.0 ($ORACLE_HOME) sur une plateforme Sun Solaris 10 x86. Dès maintenant la variable d'environnement $ORACLE_HOME est initialisée si ce n'est pas le cas :
% ORACLE_HOME=/Software/oracle/app/product/11.2.0 % export ORACLE_HOME
Pour plus d'informations sur la compilation d'unixODBC 2.3.0 avec SunStudio 12.1 : unixODBC 2.3.0, compilation et utilisation sous Sun Solaris 10 X86 ».
Vérifier que l'option ODBC a bien été sélectionnée lors de l'installation avec Oracle Universal Installer.
Pour s'en assurer, le répertoire $ORACLE_HOME/odbc doit exister avec des fichiers make (*.mk) et des librairies archives (*.a) dans le répertoire $ORACLE_HOME/odbc/lib :
% cd $ORACLE_HOME/odbc/lib % ls
ins_odbc.mk env_odbc.mk utility.a sqoci.a sqora.a
Si ce n'est pas le cas, l'option ODBC n'a pas été sélectionnée, relancer l'installation avec Oracle Universal Installer pour sélectionner le composant ODBC.
ins_odbc.mk est le fichier make pour construire la librairie libsqora.so.11.1 à partir notamment des librairies archives utility.a, sqoci.a et sqora.a générées à l'installation. unixODBC n'existait pas lors de l'installation, les commandes make dans ins_odbc.mk sont tombées en erreur lors de l'installation sans toutefois avorter l'installation d'Oracle 11g R2.
Si le répertoire /usr/ccs/bin n'est pas référencé dans la variable PATH, celui-ci y est ajouté afin d'appeler l'exécutable make qui s'y trouve :
% PATH=/usr/ccs/bin:$PATH % export PATH
Les librairies unixODBC sont référencées dans la variable LD_LIBRARY_PATH. Dans le contexte de cet article, unixODBC est installé dans le répertoire /Software/tools/unixodbc.
% LD_LIBRARY_PATH=/Software/tools/unixodbc/lib:$LD_LIBRARY_PATH % export LD_LIBRARY_PATH
Les commandes make sont alors lancées en donnant en paramètre le fichier ins_odbc.mk et isqora:
% cd $ORACLE_HOME/odbc/lib % make -f ns_odbc.mk isqora
- Linking sqora rm -f /Software/oracle/app/product/11.2.0/odbc/lib/libsqora.so.11.1 /usr/ccs/bin/ld -o /Software/oracle/app/product/11.2.0/odbc/lib/libsqora.so.11.1 -L/Software/oracle/app/product/11.2.0/odbc/lib/ -L/Software/oracle/app/product/11.2.0/lib/ -dy `cat /Software/oracle/app/product/11.2.0/lib/sysliblist` -lm -64 -G -z textoff -h libsqora.so.11.1 -zinitarray=initSqora -zfiniarray=finiSqora -z allextract /Software/oracle/app/product/11.2.0/odbc/lib/sqora.a /Software/oracle/app/product/11.2.0/odbc/lib/sqoci.a /Software/oracle/app/product/11.2.0/odbc/lib/utility.a -z defaultextract -R /Software/oracle/app/product/11.2.0/lib -L /Software/oracle/app/product/11.2.0/lib -L /Software/oracle/app/product/11.2.0/odbc/public/osds/unixODBC/lib -lclntsh /Software/oracle/app/product/11.2.0/lib/libunls11.a -ldl -lodbcinst /Software/oracle/app/product/11.2.0/lib/libcore11.a -ldl
L'argument -64 indique bien une compilation en 64 bits de la librairie libsqora.so.11.1, par ailleurs le "linking" est réalisée avec la librairie odbcinst. Cette librairie est fournie par unixODBC, c'est pourquoi la variable LD_LIBRARY_PATH référence /Software/tools/unixodbc/lib. Si la librairie odbcinst n'est pas trouvée :
ld: fatal: library -lodbcinst: not found ld: fatal: File processing errors. No output written to /Software/oracle/app/product/11.2.0/odbc/lib/libsqora.so.11.1 *** Error code 1 make: Fatal error: Command failed for target `/Software/oracle/app/product/11.2.0/odbc/lib/libsqora.so.11.1'
C'est exactement ce qui s'est produit lors de l'installation, unixODBC n'existant pas.
La commande file indique bien qu'il s'agit d'une librairie dynamique en 64 bits :
% cd $ORACLE_HOME/odbc/lib % file libsqora.so.11.1
libsqora.so.11.1: ELF 64-bit LSB dynamic lib AMD64 Version 1, dynamically linked, not stripped, no debugging information available
Elle doit être ensuite installée dans le répertoire $ORACLE_HOME/lib.
cp -f libsqora.so.11.1 $ORACLE_HOME/lib
Vérifier à cette étape les permissions sur la librairie libsqora.so.11.1, elle doit être en lecture pour tout le monde (user, group, other).
La commande ldd indique bien que cette librairie libsqora.so.11.1 est dépendante de la librairie unixODBC libodbcinst.so.1 :
% ldd libsqora.so.11.1
...
libm.so.2 => /lib/64/libm.so.2
libclntsh.so.11.1 => ./libclntsh.so.11.1
libodbcinst.so.1 => /Software/tools/unixodbc/lib/libodbcinst.so.1
libmp.so.2 => /lib/64/libmp.so.2
...
Pour tester le pilote ODBC Oracle 11g avec unixODBC : Oracle 11g R2, utilisation du pilote ODBC avec unixODBC 2.3.0 sous Sun Solaris 10 X86 »
| Version | Date | Commentaires |
|---|---|---|
| 1.0 | 08/2011 | Version initiale |
SQLPAC : unixODBC 2.3.0,
compilation et utilisation sous Sun Solaris 10 X86
SQLPAC : Oracle 11g R2,
utilisation du pilote ODBC avec unixODBC 2.3.0 sous Sun Solaris 10 X86