By Mouhamadou Diaw
Sometimes you need to access to your SQLServer from your Oracle database. There is many ways and tools to do this. In this blog I am describing how to perform this task using ODBC.
The configuration is below
-Oracle Linux server : serverora 192.168.56.41 with Oracle 19 database orcl
-Windows server : winrac1 192.168.56.100 with SQLServer Express
On my Windows server, I have a database named testdb and a table named article.
The first step is to verify that the file dg4odbc is present in your ORACLE_HOME environment
|
1
2
3
4
5
|
[oracle@serverora ~]$ cd $ORACLE_HOME/bin[oracle@serverora bin]$ file dg4odbcdg4odbc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=11d0b16445c4b65545b285a222628e03c99e8900, not stripped[oracle@serverora bin]$ |
After this we do install the ODBC driver for SQLServer on our Oracle server
-Install the repository
|
1
2
3
4
5
|
[root@serverora yum.repos.d]# curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed100 193 100 193 0 0 265 0 --:--:-- --:--:-- --:--:-- 265[root@serverora yum.repos.d]# |
-Search the name of the package
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@serverora yum.repos.d]# yum search msodbcLoaded plugins: ulninfoepel/x86_64/metalink | 19 kB 00:00:00epel | 4.7 kB 00:00:00ol7_UEKR5 | 3.0 kB 00:00:00ol7_latest | 3.6 kB 00:00:00......=============================================== N/S matched: msodbc ================================================msodbcsql.x86_64 : ODBC Driver for Microsoft(R) SQL Server(R)msodbcsql17.x86_64 : ODBC Driver for Microsoft(R) SQL Server(R) Name and summary matches only, use "search all" for everything. |
-Install the package msodbcsql17
You can find more info in the documentation
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
[root@serverora yum.repos.d]# yum remove unixODBC-utf16 unixODBC-utf16-develLoaded plugins: ulninfoNo Match for argument: unixODBC-utf16No Match for argument: unixODBC-utf16-develNo Packages marked for removal[root@serverora yum.repos.d]# ACCEPT_EULA=Y yum install -y msodbcsql17Loaded plugins: ulninfoResolving Dependencies--> Running transaction check---> Package msodbcsql17.x86_64 0:17.8.1.1-1 will be installed--> Processing Dependency: unixODBC >= 2.3.1 for package: msodbcsql17-17.8.1.1-1.x86_64--> Processing Dependency: libodbcinst.so.2()(64bit) for package: msodbcsql17-17.8.1.1-1.x86_64--> Running transaction check---> Package unixODBC.x86_64 0:2.3.7-1.rh will be installed--> Finished Dependency ResolutionDependencies Resolved==================================================================================================================== Package Arch Version Repository Size====================================================================================================================Installing: msodbcsql17 x86_64 17.8.1.1-1 packages-microsoft-com-prod 905 kInstalling for dependencies: unixODBC x86_64 2.3.7-1.rh packages-microsoft-com-prod 213 kTransaction Summary====================================================================================================================Install 1 Package (+1 Dependent package)Total download size: 1.1 MInstalled size: 2.9 MDownloading packages:warning: /var/cache/yum/x86_64/7Server/packages-microsoft-com-prod/packages/unixODBC-2.3.7-1.rh.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID be1229cf: NOKEYPublic key for unixODBC-2.3.7-1.rh.x86_64.rpm is not installed(1/2): unixODBC-2.3.7-1.rh.x86_64.rpm | 213 kB 00:00:00(2/2): msodbcsql17-17.8.1.1-1.x86_64.rpm | 905 kB 00:00:00--------------------------------------------------------------------------------------------------------------------Total 1.9 MB/s | 1.1 MB 00:00:00Retrieving key from https://packages.microsoft.com/keys/microsoft.ascImporting GPG key 0xBE1229CF: Userid : "Microsoft (Release signing) " Fingerprint: bc52 8686 b50d 79e3 39d3 721c eb3e 94ad be12 29cf From : https://packages.microsoft.com/keys/microsoft.ascRunning transaction checkRunning transaction testTransaction test succeededRunning transaction Installing : unixODBC-2.3.7-1.rh.x86_64 1/2 Installing : msodbcsql17-17.8.1.1-1.x86_64 2/2 Verifying : msodbcsql17-17.8.1.1-1.x86_64 1/2 Verifying : unixODBC-2.3.7-1.rh.x86_64 2/2Installed: msodbcsql17.x86_64 0:17.8.1.1-1Dependency Installed: unixODBC.x86_64 0:2.3.7-1.rhComplete![root@serverora yum.repos.d]# |
-Install the package mssql-tools
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
[root@serverora yum.repos.d]# ACCEPT_EULA=Y yum install -y mssql-toolsLoaded plugins: ulninfoResolving Dependencies--> Running transaction check---> Package mssql-tools.x86_64 0:17.8.1.1-1 will be installed--> Finished Dependency ResolutionDependencies Resolved==================================================================================================================== Package Arch Version Repository Size====================================================================================================================Installing: mssql-tools x86_64 17.8.1.1-1 packages-microsoft-com-prod 287 kTransaction Summary====================================================================================================================Install 1 PackageTotal download size: 287 kInstalled size: 714 kDownloading packages:mssql-tools-17.8.1.1-1.x86_64.rpm | 287 kB 00:00:00Running transaction checkRunning transaction testTransaction test succeededRunning transaction Installing : mssql-tools-17.8.1.1-1.x86_64 1/1 Verifying : mssql-tools-17.8.1.1-1.x86_64 1/1Installed: mssql-tools.x86_64 0:17.8.1.1-1Complete![root@serverora yum.repos.d]# |
-Install the unixODBC-devel package
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
[root@serverora bin]# yum install -y unixODBC-develLoaded plugins: ulninfoResolving Dependencies--> Running transaction check---> Package unixODBC-devel.x86_64 0:2.3.7-1.rh will be installed--> Finished Dependency ResolutionDependencies Resolved==================================================================================================================== Package Arch Version Repository Size====================================================================================================================Installing: unixODBC-devel x86_64 2.3.7-1.rh packages-microsoft-com-prod 42 kTransaction Summary====================================================================================================================Install 1 PackageTotal download size: 42 kInstalled size: 196 kDownloading packages:unixODBC-devel-2.3.7-1.rh.x86_64.rpm | 42 kB 00:00:00Running transaction checkRunning transaction testTransaction test succeededRunning transaction Installing : unixODBC-devel-2.3.7-1.rh.x86_64 1/1 Verifying : unixODBC-devel-2.3.7-1.rh.x86_64 1/1Installed: unixODBC-devel.x86_64 0:2.3.7-1.rhComplete![root@serverora bin]# |
Now we can edit the odbc files. Below the contents of my files
-/etc/odbc.ini
|
1
2
3
4
5
6
7
8
|
[root@serverora etc]# cat odbc.ini[MY_ODBC_TEST]Driver = /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.8.so.1.1Server = winrac1Port = 1433Database = testdb[root@serverora etc]# |
-/etc/odbcinst.ini
|
1
2
3
4
5
6
7
|
[root@serverora etc]# cat odbcinst.ini[ODBC Driver 17 for SQL Server]Description=Microsoft ODBC Driver 17 for SQL ServerDriver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.8.so.1.1UsageCount=1[root@serverora etc]# |
Be sure that the Driver is pointing to the right location for libmsodbcsql-17.8.so.1.1
|
1
2
3
|
[oracle@serverora lib64]$ ls -l /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.8.so.1.1-rwxr-xr-x. 1 root root 2065184 Jun 26 12:34 /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.8.so.1.1[oracle@serverora lib64]$ |
Now let’s validate the connexion ODBC to the SQLserver database from the Oracle server
-Using sqlcmd
|
1
2
3
4
5
6
7
8
9
10
11
12
|
[oracle@delphixdev1 ~]$ /opt/mssql-tools/bin/sqlcmd -D -S MY_ODBC_TEST -U saPassword:1> select * from article;2> goidart designation------ -------------------------------------------------- 1 boisson 2 écran 3 où(3 rows affected)1> |
-Using isql
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[oracle@serverora opt]$ which isql/usr/bin/isql[oracle@serverora ~]$ isql -v MY_ODBC_TEST sa root+---------------------------------------+| Connected! || || sql-statement || help [tablename] || quit || |+---------------------------------------+SQL> select * from article;+-------+---------------------------------------------------+| idart | designation |+-------+---------------------------------------------------+| 1 | boisson || 2 | écran || 3 | où |+-------+---------------------------------------------------+SQLRowCount returns 03 rows fetchedSQL> |
We can see above that I can query my article table in the SQLServer database from my Oracle server.
On the Oracle server let’s create the file inithsconnect.ora for the instance hsconnect (you can choose another name for the instance if you want)
|
1
2
3
4
5
6
7
8
9
10
11
|
[oracle@serverora admin]$ pwd/u01/app/oracle/product/19.0.0/db_1/hs/admin[oracle@serverora admin]$ cat inithsconnect.oraHS_FDS_CONNECT_INFO = MY_ODBC_TESTHS_FDS_TRACE_LEVEL = userHS_FDS_SHAREABLE_NAME = /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.8.so.1.1set ODBCINI = /etc/odbc.iniHS_NLS_NCHAR = UCS2[oracle@serverora admin]$ |
On the Oracle server let’s adjust the listener.ora to add a static entry for the instance hsconnect
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
[oracle@serverora admin]$ pwd/u01/app/oracle/product/19.0.0/db_1/network/admin[oracle@serverora admin]$ cat listener.ora# listener.ora Network Configuration File: /u01/app/oracle/product/19.0.0/db_1/network/admin/listener.ora# Generated by Oracle configuration tools.LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.41)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) )SID_LIST_LISTENER = (SID_LIST = (SID_DESC= (SID_NAME=hsconnect) (ORACLE_HOME= /u01/app/oracle/product/19.0.0/db_1) (PROGRAM=dg4odbc) (ENVS=LD_LIBRARY_PATH=/opt/microsoft/msodbcsql17/lib64) ) )[oracle@serverora admin]$ |
On the Oracle server let’s add an entry for instance hsconnect
|
1
2
3
4
5
6
7
|
hsconnect= (DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.41)(PORT=1521)) (CONNECT_DATA= (SID=hsconnect)) (HS=OK) ) ) |
Be sure that you can do a tnsping to your hsconnect alias
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[oracle@serverora admin]$ tnsping hsconnectTNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 29-OCT-2021 12:33:50Copyright (c) 1997, 2020, Oracle. All rights reserved.Used parameter files:/u01/app/oracle/product/19.0.0/db_1/network/admin/sqlnet.oraUsed TNSNAMES adapter to resolve the aliasAttempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.41)(PORT=1521)) (CONNECT_DATA= (SID=hsconnect)) (HS=OK))OK (0 msec)[oracle@serverora admin]$ |
From your Oracle database, create a dblink pointing to your SQLServer and test your dblink
|
1
2
3
4
5
6
7
8
9
|
SQL> create public database link hslink connect to "sa" identified by "root" using 'hsconnect';Database link created.SQL> select * from dual@hslink;D-X |
And then finally you should be able to query your SQLServer article table from your Oracle database
|
1
2
3
4
5
6
7
|
SQL> select * from article@hslink; idart designation---------- ----------------------------------- 1 boisson 2 ecran 3 ou |
To resolve the issue with the French accents, just set the NLS_LANG as below
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[oracle@serverora admin]$ export NLS_LANG=AMERICAN_AMERICA.UTF8[oracle@serverora admin]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Fri Oct 29 13:15:11 2021Version 19.10.0.0.0Copyright (c) 1982, 2020, Oracle. All rights reserved.Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.10.0.0.0SQL> col designation for a25SQL> select * from article@hslink; idart designation---------- ------------------------- 1 boisson 2 écran 3 oùSQL> |
Conclusion
Hope this article will help
Luis
24.09.2024Thanks, Franco! Your comment allowed me to correct the same error in my environment. It still works in 2024!