Oracle 11g R2, utilisation du pilote ODBC avec unixODBC 2.3.0 sous Sun Solaris 10 X86

Logo

Introduction

La couche unixODBC propose le binaire iusql afin d’attaquer des bases de données avec la couche ODBC via un DSN (Data Source Name). Cet utilitaire s’avère très pratique en cas de diagnostic.

Cet article présente le référencement du pilote ODBC 64 bits Oracle 11g natif dans la couche unixODBC 2.3.0 ainsi qu’un test de connexion à une instance Oracle via ODBC avec iusql.

Environnement

Environnement Oracle 11g R2

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 64bits. 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

Le pilote ou "driver" natif ODBC d’Oracle 11g R2 est une librairie dynamique qui s’appelle libsqora.so.11.1 installée dans le répertoire $ORACLE_HOME/lib. Si cette librairie n’existe pas, il est peut être nécessaire de la compiler, voire de l’installer avec Oracle Universal Installer : Oracle 11g R2, compilation du pilote ODBC avec unixODBC 2.3.0 sous Sun Solaris 10 X86

Environnement unixODBC

La distribution unixODBC est une version 2.3.0 64 bits, elle est installée dans le répertoire /Software/tools/unixodbc.

Les fichiers de configuration odbcinst.ini et odbc.ini de la distribution unixODBC sont installés dans le sous répertoire /Software/tools/unixodbc/etc.

Les librairies d’unixODBC 2.3.0 sont sompilées en 64 bits dans le répertoire /Software/tools/unixodbc/lib : libodbcinst.so, libodbc.so, libodbcccr.so.

Pour plus d’informations sur la compilation d’unixODBC 2.3.0 sur les plateformes Sun Solaris 10 x86 64 bits : unixODBC 2.3.0,compilation et utilisation sous Sun Solaris 10 X86

Les fichiers odbcinst.ini et odbc.ini d’unixODBC pour Oracle 11g R2 : odbc_update_ini.sh

Le script shell odbc_update_ini.sh dans le répertoire $ORACLE_HOME/odbc/utl est très pratique pour mettre à jour les fichiers odbcinst.ini et odbc.ini d’unixODBC et disposer de modèles (templates) :

% cd $ORACLE_HOME/odbc/utl
% odbc_update_ini.sh
           *** Please pass ODBCDM_HOME as arg-1, and optional arguments -
 *** Install location (arg-2), Driver name (arg-3) & DSN (arg-4).
 *** Usage:  odbc_update_ini.sh <ODBCDM_Home>
         [<Install_Location>] [<Driver_Name>] [<DSN>]
<ODBCDM_Home> Obligatoire Répertoire d’installation d’unixODBC (/Software/tools/unixodbc ici).
<Install_Location> Optionnel Répertoire dans lequel est installé le pilote ODBC Oracle libsqora.so.11.1. Il est obligatoire si le script odbc_update_ini.sh n’est pas exécuté depuis le répertoire d’installation de libsqora.so.11.1.
<Driver_Name> Optionnel Spécifie un nom de pilote personnalisé autre que celui par défaut "Oracle 11g ODBC driver".
<DSN> Optionnel Spécifie un nom de DSN (Data Source Name) personnalisé autre que celui par défaut "OracleODBC-11g".

Avant d’exécuter ce script, vérifier que le compte oracle a bien les droits d’écriture sur le fichier <répertoire unixODBC>/etc/odbcinst.ini d’unixODBC.

% cd $ORACLE_HOME/odbc/utl

% odbc_update_ini.sh /Software/tools/unixodbc /Software/oracle/app/product/11.2.0/lib

Grâce au script odbc_update_ini.sh, le fichier odbcinst.ini dans le répertoire /Software/tools/unixodbc/etc est mis à jour pour le référencement du pilote Oracle ODBC 11g

/Software/tools/unixodbc/etc/odbcinst.ini
[Oracle 11g ODBC driver]
Description     = Oracle ODBC driver for Oracle 11g
Driver          = /Software/oracle/app/product/11.2.0/lib/libsqora.so.11.1
Setup           =
FileUsage       =
CPTimeout       =
CPReuse         =

Et on dispose d’une entrée modèle (template) pour un DSN dans le fichier .odbc.ini créé par le script odbc_update_ini.sh dans le répertoire $HOME du compte oracle :

$HOME/.odbc.ini
[OracleODBC-11g]
Application Attributes = T
Attributes = W
BatchAutocommitMode = IfAllSuccessful
BindAsFLOAT = F
CloseCursor = F
DisableDPM = F
DisableMTS = T
Driver = Oracle 11g ODBC driver
DSN = OracleODBC-11g
EXECSchemaOpt =
EXECSyntax = T
Failover = T
FailoverDelay = 10
FailoverRetryCount = 10
FetchBufferSize = 64000
ForceWCHAR = F
Lobs = T
Longs = T
MaxLargeData = 0
MetadataIdDefault = F
QueryTimeout = T
ResultSets = T
ServerName = 
SQLGetData extensions = F
Translation DLL =
Translation Option = 0
DisableRULEHint = T
UserID = 
StatementCache=F
CacheBufferSize=20
UseOCIDescribeAny=F

Ce modèle peut être copié dans le fichier odbc.ini d’unixODBC (/Software/tools/unixodbc/etc).

Connexion à une instance Oracle avec le binaire iusql d’unixODBC

Dans ce test, une connexion à l’instance RISKD est réalisée avec le binaire iusql d’unixODBC. L’instance RISKD est référencée dans le fichier tnsnames.ora :

/Software/oracle/app/product/11.2.0/network/admin/tnsnames.ora
…
RISKD =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = FRDSOP501)(PORT = 1555))
    )
    (CONNECT_DATA =
      (SID = RISKD)
    )
  )
…

Environnement Oracle

Le compte Unix utilisé ici n’est pas oracle, les variables d’environnement PATH, LD_LIBRARY_PATH et ORACLE_HOME sont mises à jour pour ce compte pour incorporer l’environnement Oracle :

% ORACLE_HOME=/Software/oracle/app/product/11.2.0 
% export ORACLE_HOME

% PATH=$ORACLE_HOME/bin:$PATH
% export PATH

% LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
% export LD_LIBRARY_PATH

Création du DSN RISKD

La source de données DSN RISKD est créée dans le fichier odbc.ini d’unixODBC grâce au modèle généré précédemment (la sortie est allégée pour la lisibilité) :

/Software/tools/unixodbc/etc/odbc.ini
[RISKD]
…
Driver = Oracle 11g ODBC driver
DSN = RISKD
…
ServerName = RISKD

L’exécutable odbc_config d’unixODBC permet de vérifier que la connexion avec iusql sera bien réalisée avec les fichiers odbcinst.ini et odbc.ini localisés dans le répertoire <répertoire unixodbc>/etc :

% cd /Software/tools/unixodbc/bin

% odbc_config --odbcini --odbcinstini --odbcversion
          /Software/tools/unixodbc/etc/odbc.ini
/Software/tools/unixodbc/etc/odbcinst.ini
3

Connexion avec iusql d’unixODBC

La syntaxe du binaire iusql est très simple :

% cd /Software/tools/unixodbc/bin

% iusql
**********************************************
* unixODBC - isql                            *
**********************************************
* Syntax                                     *
*                                            *
*      isql DSN [UID [PWD]] [options]        *
*                                            *
…

Le test de connexion avec iusql sur le DSN RISKD peut démarrer, l’option -v est donnée pour la verbosité en cas de diagnostics nécessaires :

% cd /Software/tools/unixodbc/bin

% iusql -v RISKD system ********
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

select username from dba_users;
+-------------------------------+
| USERNAME                      |
+-------------------------------+
| SYSTEM                        |
| SYS                           |
…
SQLRowCount returns -1
40 rows fetched

Diagnostiquer les erreurs avec l’option -v du binaire iusql

L’option -v est très pratique pour diagnostiquer les erreurs. Sans cette option, un message très peu parlant est affiché par le binaire iusql :

[ISQL]ERROR: Could not SQLConnect

Voici quelques exemples de diagnostics simples.

Le DSN n’existe pas

% iusql -v RISKE system ********
          [IM002][unixODBC][Driver Manager]Data source name not found,
 and no default driver specified
[ISQL]ERROR: Could not SQLConnect

Problème de chargement de librairies

% iusql -v RISKD system ********
          [01000][unixODBC][Driver Manager]Can't open lib
 '/Software/oracle/app/product/11.2.0/lib/libsqora.so.11.1' 
: file not found
[ISQL]ERROR: Could not SQLConnect

Dans ce cas de figure, la commande ldd sur la librairie libsqora.so.11.1 permettra de diagnostiquer immédiatement le problème :

% ldd /Software/oracle/app/product/11.2.0/lib/libsqora.so.11.1
          …
    libodbcinst.so.1  =>    (file not found)

Solution simple : le répertoire /Software/tools/unixodbc/lib des librairies d’unixODBC n’est pas référencé dans la variable d’environnement LD_LIBRARY_PATH.

Le cas courant : mot de passe invalide

% iusql -v RISKD system ********
          [28000][unixODBC][Oracle][ODBC][Ora]ORA-01005: null password given; logon denied

[ISQL]ERROR: Could not SQLConnect