Skip to main content

The trouble of getting APEX on MySQL to work...

In theory it should be so easy...running an APEX application on an Oracle instance with database links to MySQL for retrieving and modifying data. In theory that is, because in practice it is somewhat more cumbersome. I finally got there, but it took some steps  - and patience...

I started off with the steps provided from a couple of websites. Like these from Birijan, from Pythian, from WebAJ and from Easysoft. They´re all not the most recent ones, so I downloaded the latest versions of MySQL (5.1.51), MySQL Connector for ODBC (5.1.7) and unixODBC (2.3.0) and installed this stuff on top of the Oracle Developer Days Virtual Machine. Following the steps provided on the sites earlier mentioned I had a MySQL database with a demo table within minutes. So far so good!

After changing the odbcinst.ini, odbc.ini, tlistener.ora, tnsnames.ora and the initmysql.ora (in $ORACLE_HOME/hs/admin) file I fired up SQL*Plus and created a databaselink using 
create database link mysql
  connect to "demo"
  identified by "demo"
  using 'mysql';
So I expected a nice return set when I entered
select * from "employees"@mysql;
But instead of a list of employees I got this (very unclear) message:
ERROR at line 1:
ORA-28500: connection from ORACLE to a 
non-Oracle system returned this message:
[
So I Googled around, tried this and that, traced everything traceable. But still couldn't get any other result than the ORA-28500. So I turned to the forum for help, which resulted in this thread. In the last post you can see what the (simple) solution was: in the initmysql.ora (or whatever that file is called), I had a line for the language/region/characterset setting and there was a very tiny typo ...
HS_LANGUAGE=AMERICAN.AMERICA.WE8ISO8859P15
should be
HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P15
So from that moment on, I could enter a SQL statement in SQL*Plus and retrieve data from my MySQL database! But the happiness didn't last that long ;-(
Over and over and whatever I tried, I only retrieved just one row from my employees table - the first one according to the ordering of the result set. And sometimes even I just got one - the first - column back, and the other columns where just "gone"....

So, again, I called to the Oracle Forums to the rescue, which resulted in this thread. Again, a lot of tracing and after some time it seemed to be a problem in the version of the MySQL ODBC Connnector, because version 5.1.7 didn't work (and 5.1.0 had the same problem), while 5.1.5 did work. So I deinstalled my current version and reinstalled the previous GA version: 3.51.27. And from that moment on it worked flawlessly! I could query, insert, update and delete records in my MySQL database from Oracle without a hitch.

The last step - using an APEX application to do the data manipulation - is well written by Ilmar Kerm in this blog post, including some code to implement optimistic locking and to overcome the ORA-02047 error. And now - finally - I got an APEX application running on MySQL (in fact, it stills runs on Oracle, but uses MySQL data of course).

So after all you can do it in an hour or two:
- if you don't make any stupid typos and
- if you're "lucky" enough to use (or get) the working drivers immediately!

Comments

Buzz Killington said…
To me, that is one of the downsides of Tibco versus other technologies. Most other languages/frameworks use JDBC - in theory you should be able to setup a dblink anywhere, but as you demonstrate, in practice that is not also as easy.
Buzz Killington said…
Oops I mean of Apex (typo) and not Tibco.
Learco Brizzi said…
Hi Roel, good post. You finally got it working!
Hi Roel, Thank you for sharing your experience, good work, we need the usage of Oracle XE and Mysql.
Mark Pulles said…
Hello Roel,

After several day's of experimenting with lot's of settings and dissapointments, i bumped into your post and i'm very glad i did!!
Especially the older ODBC driver and the CS did the trick. Thank's !
test said…
I was really looking hard to run my APEX application on Mysql but getting it hard to run it.Thanks to this solution,now i am able to run it successfully.I also got some resources which is useful in JDBC driver as well.Thanks!

Popular posts from this blog

Filtering in the APEX Interactive Grid

Remember Oracle Forms? One of the nice features of Forms was the use of GLOBAL items. More or less comparable to Application Items in APEX. These GLOBALS where often used to pre-query data. For example you queried Employee 200 in Form A, then opened Form B and on opening that Form the Employee field is filled with that (GLOBAL) value of 200 and the query was executed. So without additional keys strokes or entering data, when switching to another Form a user would immediately see the data in the same context. And they loved that. In APEX you can create a similar experience using Application Items (or an Item on the Global Page) for Classic Reports (by setting a Default Value to a Search Item) and Interactive Reports (using the  APEX_IR.ADD_FILTER  procedure). But what about the Interactive Grid? There is no APEX_IG package ... so the first thing we have to figure out is how can we set a filter programmatically? Start with creating an Interactive Grid based upon the good old Employ

apex_application.g_f0x array processing in Oracle 12

If you created your own "updatable reports" or your custom version of tabular forms in Oracle Application Express, you'll end up with a query that looks similar to this one: then you disable the " Escape special characters " property and the result is an updatable multirecord form. That was easy, right? But now we need to process the changes in the Ename column when the form is submitted, but only if the checkbox is checked. All the columns are submitted as separated arrays, named apex_application.g_f0x - where the "x" is the value of the "p_idx" parameter you specified in the apex_item calls. So we have apex_application.g_f01, g_f02 and g_f03. But then you discover APEX has the oddity that the "checkbox" array only contains values for the checked rows. Thus if you just check "Jones", the length of g_f02 is 1 and it contains only the empno of Jones - while the other two arrays will contain all (14) rows. So for

Stop using validations for checking constraints !

 If you run your APEX application - like a Form based on the EMP table - and test if you can change the value of Department to something else then the standard values of 10, 20, 30 or 40, you'll get a nice error message like this: But it isn't really nice, is it? So what do a lot of developers do? They create a validation (just) in order to show a nicer, better worded, error message like "This is not a valid department".  And what you then just did is writing code twice : Once in the database as a (foreign key) check constraint and once as a sql statement in your validation. And we all know : writing code twice is usually not a good idea - and executing the same query twice is not enhancing your performance! So how can we transform that ugly error message into something nice? By combining two APEX features: the Error Handling Function and the Text Messages! Start with copying the example of an Error Handling Function from the APEX documentation. Create this function