Oracle Heterogeneous Services Configuration for MySQL (With ODBC/OLEDB

)

Author Email

: :

Sethunath. U sethunathu@gmail.com

References
http://birijan.com.np/?q=Oracle+Heterogeneous+Services+(Accessing+ODBC+data+source) : Birijan Maharajan http://articles.techrepublic.com.com/5100-10878_11-5725974.html : Scott Stephens

Sethunath

Page 1

5/29/2008

Introduction
Heterogeneous services in Oracle permits connection with non-oracle database systems. Oracle provides two types of Heterogeneous Services agents, Oracle Transparent Gateways and Generic Connectivity. This document details Generic Connectivity which uses Generic Connectivity agents for ODBC and OLEDB which enable you to use ODBC and OLEDB drivers to access MySQL that have an ODBC or an OLEDB interface. Any data source compatible with the ODBC or OLEDB standards can be accessed using a Generic Connectivity agent. As there is no transparent gateway available for MySQL, it can be used to access MySQL; though with certain limitations. Using Windows XP Oracle EE 10.2.0.3 MySQL version: 5.0

1. Login to mysql H:\> mysql -u root mysql -p Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 to server version: 5.0.24a-community-nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 2. Grant privileges to root user mysql> grant usage on *.* to root@localhost with grant option; Query OK, 0 rows affected (0.05 sec) 3. Create database mysql> create database oraclecall; Query OK, 0 rows affected (0.04 sec) mysql> grant usage on *.* to root@localhost with grant option; Query OK, 0 rows affected (0.05 sec) mysql> use oraclecall; Database changed 4. Create a user “oracle” This user id will be used to authenticate using ODBC/OLEDB mysql> grant all on oraclecall.* to 'oracle'@'localhost' identified by 'oracle'; Query OK, 0 rows affected (0.02 sec) mysql> flush PRIVILEGES; Query OK, 0 rows affected (0.08 sec)

5. Install MySQL ODBC driver 3.51 and configure as follows

Sethunath

Page 2

5/29/2008

6. Configure Oracle Heterogeneous services for ODBC. Here it can be configured by two methods. We can use either of these two methods. 6.1 Through OLEDB Create a UDL file (create a text file called msoracle.udl) and save it. Doubleclick the file to configure the connectivity and configure it as follows.

Select “Use connection string” and click build to select the data source. Select the data source we created previously (i.e msora35)

Sethunath

Page 3

5/29/2008

Elf The UDL file will look like the following
[oledb] ; Everything after this line is an OLE DB initstring Provider=MSDASQL.1;Password=oracle;Persist Security Info=True;User ID=oracle;Extended Properties="DATABASE=oraclecall;DESCRIPTION=MySQL ODBC 3.51 Driver;DSN=msora35;OPTION=0;PWD=oracle;PORT=0;SERVER=localhost;UID=oracle;";Initial Catalog=oraclecall

Create the init parameters for Heterogeneous services which will be in $ORACLE_HOME\hs\admin. Make sure to name it as init<SID>.ora In our case it will be named as initmsora35.ora. The contents of initmsora35.ora will be as follows
# This is a sample agent init file that contains the HS parameters that are # needed for an ODBC Agent. # # HS init parameters HS_FDS_CONNECT_INFO = "UDLFILE=D:/oracle/DB10G/hs/admin/msoracle.udl" HS_FDS_TRACE_LEVEL = 0 # Environment variables required for the non-Oracle system # #set <envvar>=<value>

We can access HS by the SQL*Net listener, not the client. So we must let SQL*Net know about these services and the programs that proxy Oracle SQL to these ODBC and OLE DB providers. In the listener.ora file in ORACLE_HOME/network/admin, you should see an area for SID_LIST_LISTENER, and within that an SID_LIST. In that list, add the entries for each service, like so
# listener.ora Network Configuration File: D:\ORACLE\DB10G\network\admin\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = D:\ORACLE\DB10G) (PROGRAM = extproc) ) (SID_DESC = (SID_NAME = msora35) (ORACLE_HOME = D:\ORACLE\DB10G) (PROGRAM = hsolesql) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) (ADDRESS = (PROTOCOL = TCP)(HOST = N7224.ibsplc.com)(PORT = 1521)) ) )

hsolesql program access OLE DB. We will be using the hsolesql program for providers that can process SQL.The ORACLE_HOME directory directs the SQL*Net listener to the correct installation for that program. Once you make these changes, restart the listener by entering the following code at the command line: Lsnrctl stop Lsnrctl start

6.2

Through ODBC

Sethunath

Page 4

5/29/2008

In our case it will be named as initmsora35.ora. The contents of initmsora35.ora will be as follows
# This is a sample agent init file that contains the HS parameters that are # needed for an ODBC Agent. # # HS init parameters HS_FDS_CONNECT_INFO = msora35 HS_FDS_TRACE_LEVEL = 0 # Environment variables required for the non-Oracle system # #set <envvar>=<value>

We can access HS by the SQL*Net listener, not the client. So we must let SQL*Net know about these services and the programs that proxy Oracle SQL to these ODBC and OLE DB providers. In the listener.ora file in ORACLE_HOME/network/admin, you should see an area for SID_LIST_LISTENER, and within that an SID_LIST. In that list, add the entries for each service, like so
# listener.ora Network Configuration File: D:\ORACLE\DB10G\network\admin\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = D:\ORACLE\DB10G) (PROGRAM = extproc) ) (SID_DESC = (SID_NAME = msora35) (ORACLE_HOME = D:\ORACLE\DB10G) (PROGRAM = hsodbc) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) (ADDRESS = (PROTOCOL = TCP)(HOST = N7224.ibsplc.com)(PORT = 1521)) ) )

hsolesql program access OLE DB. We will be using the hsolesql program for providers that can process SQL.The ORACLE_HOME directory directs the SQL*Net listener to the correct installation for that program. Once you make these changes, restart the listener by entering the following code at the command line: Lsnrctl stop Lsnrctl start

7. Configure tnsnames.ora

Add entries to point to the HS in the ORACLE_HOME/network/admin/tnsnames.ora file:
msora = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SID= msora35)) (HS=OK) )

8. Validate accessibility

Sethunath

Page 5

5/29/2008

A connection test will succeed with TNSPING utility. However, this only checks the connection up to SQL*Net, and not whether the data is available. For that purpose, login to oracle and create database links.
D:\> sqlplus / as sysdba SQL> create public database link mysql connect to "oracle" identified by "oracle" using 'msora'; Database link created. SQL> select * from tester@mysql; id ---------10 11 name -----------------------John Raju values (12,'Mukund');

SQL> insert into tester@mysql 1 row created. SQL> commit; Commit complete.

Now, check in mysql
mysql> select * from tester; +------+--------+ | id | name | +------+--------+ | 10 | John | | 11 | Raju | | 12 | Mukund | +------+--------+ 3 rows in set (0.00 sec)

9. Troubleshooting errors If you got any error specifying syntax as below, it might be due to the sql_mode in MySQL database.
ORA-28500: connection from ORACLE to a non-Oracle system returned this message: [MySQL][ODBC 3.51 Driver][mysqld-4.1.20]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"ALL_TABLES"' at line 1 ORA-02063: preceding 2 lines from MYSQL

To solve this issue, execute following to change the sql_mode to ansi_quotes at session level.
DECLARE ret INTEGER; c INTEGER; BEGIN c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@mysql; DBMS_HS_PASSTHROUGH.PARSE@mysql(c, 'SET SESSION SQL_MODE=ANSI_QUOTES'); ret := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@mysql(c); dbms_output.put_line(ret ||' passthrough output'); DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@mysql(c); END;

Sethunath

Page 6

5/29/2008

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.