{"id":93,"date":"2018-09-17T21:10:54","date_gmt":"2018-09-17T21:10:54","guid":{"rendered":"http:\/\/oracle-internals.com\/blog\/?p=93"},"modified":"2020-04-21T05:17:11","modified_gmt":"2020-04-21T05:17:11","slug":"open-source-odbc-drivers-for-oracle","status":"publish","type":"post","link":"http:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/","title":{"rendered":"Open Source ODBC Drivers for Oracle"},"content":{"rendered":"<p><span style=\"font-size: 1rem;\">In the good old days, database-agnostic applications were written using drivers that implemented the <\/span><a style=\"font-size: 1rem;\" href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/odbc\/microsoft-open-database-connectivity-odbc\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft Open Database Connectivity (ODBC) API<\/a><span style=\"font-size: 1rem;\">, especially on Windows. Much like JDBC, ODBC provided developers with a single, interoperable,\u00a0<\/span><span style=\"font-size: 1rem;\">C-based programming language interface that made it possible for applications to access data from a variety of database management systems.<\/span><\/p>\n<p><span style=\"font-size: 1rem;\">When developing an ODBC-based application with Oracle, there were a variety of drivers to choose from including:<\/span><\/p>\n<ul>\n<li><a href=\"http:\/\/www.oracle.com\/technetwork\/database\/features\/oci\/odbc-ic-releasenotes-094306.html\" target=\"_blank\" rel=\"noopener noreferrer\">Official Oracle\u00ae ODBC Driver<\/a><\/li>\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/odbc\/microsoft\/odbc-driver-for-oracle\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft\u00ae ODBC Driver for Oracle<\/a><\/li>\n<li><a href=\"https:\/\/www.progress.com\/odbc\/oracle-database\" target=\"_blank\" rel=\"noopener noreferrer\">DataDirect ODBC Driver for Oracle<\/a><\/li>\n<li><a href=\"https:\/\/uda.openlinksw.com\/odbc-oracle\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenLink ODBC drivers for Oracle<\/a><\/li>\n<li><a href=\"https:\/\/www.easysoft.com\/products\/data_access\/odbc_oracle_driver\/index.html\" target=\"_blank\" rel=\"noopener noreferrer\">Easysoft\u00a0Oracle\u00ae ODBC Driver<\/a><\/li>\n<li><a href=\"https:\/\/www.devart.com\/odbc\/oracle\/\" target=\"_blank\" rel=\"noopener noreferrer\">Devart ODBC Driver for Oracle<\/a><\/li>\n<\/ul>\n<p>While several of these companies offer wire-protocol implementations of their drivers, which didn&#8217;t require Oracle Client, the majority of supportable ones (or ones that required advanced functionality) are based on top of the <a href=\"https:\/\/www.oracle.com\/database\/technologies\/appdev\/oci.html\" target=\"_blank\" rel=\"noopener noreferrer\">Oracle Call Interface<\/a>, including the Oracle ODBC driver itself. With the exception of Oracle&#8217;s driver, however, the other commercial drivers are rather expensive. So much so, in fact, that I&#8217;ve seen companies pay almost the cost of a database license just to deploy the driver across their enterprise.<\/p>\n<p>To get around this, several open-source ODBC drivers for Oracle Database had been developed. The two most notable drivers are as follows:<\/p>\n<p><strong>Easysoft ODBC Driver for Oracle (in C)<\/strong><br \/>\nFirst, before it became a commercial product, Easysoft released their driver as open-source. Like other ODBC drivers for Oracle available at the time, it was based on top of OCI. Over the years, however, this seemed to get lost. For that reason, when I ran across the code for it in my archive the other day, I figured I&#8217;d upload it to GitHub for all the world to see. You can find it <a href=\"https:\/\/github.com\/nextgres\/oss-easysoft-odbc-oriver-for-oracle\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>. Thanks to the legal principle of promissory estoppel, while the C code is no longer publicly available from Easysoft, the Easysoft Public License (EPL) which it was originally distributed under is still applicable. The EPL appears to be very Apache-like in nature, permitting inclusion in a commercial application as long as any changes to the driver itself are made available and the copyright acknowledgement is made.<\/p>\n<p><strong>EDO Driver for Oracle (in C++)<\/strong><br \/>\nThis driver was written by Edwig &#8220;Edo&#8221; Huisman, who ran into a number of the bugs and limitations found in the ODBC driver for Oracle9i and who also found the commercial offerings to be too expensive. Unlike the Easysoft driver, which is designed for UnixODBC, I&#8217;ve never tried to compile this on UNIX\/Linux. I do think, however, someone with a little C++ and ODBC driver development knowledge could easily get it to compile within a day or so. While it&#8217;s currently released under the GPL, Edwig has said he&#8217;s looking to re-license it under something more liberal&#8211;perhaps even the MIT license&#8211;provided portions of the code are re-written. While the project for this is on <a href=\"https:\/\/sourceforge.net\/projects\/edo-odbc\/\" target=\"_blank\" rel=\"noopener noreferrer\">SourceForge<\/a>, you can find my repo of the code <a href=\"https:\/\/github.com\/nextgres\/oss-edo-odbc-driver-for-oracle\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n<p>The last update to the open-source Easysoft driver was made in 2002 and, of the two, Edo&#8217;s driver is certainly more readable, recent, and well-tested. Likewise, Edo seems to be a pretty responsive and good guy. If I find time, I&#8217;d like to get his driver going on UNIX\/Linux.<\/p>\n<p><strong>A Word About Wire-Protocol ODBC Drivers<\/strong><br \/>\nHaving reached out to the authors of these drivers to offer licensing of my own protocol stack, the response from many suggests they have done an almost verbatim copy and source-to-source translation of the wire protocol code from Oracle&#8217;s JDBC driver. While this certainly isn&#8217;t a legal form of reverse engineering, I guess they&#8217;re not big enough for Oracle to go after. Likewise, while every one of these drivers will work with newer versions of Oracle, they all appear to use rather antiquated calls emulating the JDBC driver and don&#8217;t take advantage of many improvements in OCI over the years. YMMV.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the good old days, database-agnostic applications were written using drivers that implemented the Microsoft Open Database Connectivity (ODBC) API, especially on Windows. Much like JDBC, ODBC provided developers with a single, interoperable,\u00a0C-based programming language interface that made it possible for applications to access data from a variety of database management systems. When developing an [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Open Source ODBC Drivers for Oracle - Oracle Internals<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Open Source ODBC Drivers for Oracle - Oracle Internals\" \/>\n<meta property=\"og:description\" content=\"In the good old days, database-agnostic applications were written using drivers that implemented the Microsoft Open Database Connectivity (ODBC) API, especially on Windows. Much like JDBC, ODBC provided developers with a single, interoperable,\u00a0C-based programming language interface that made it possible for applications to access data from a variety of database management systems. When developing an [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/\" \/>\n<meta property=\"og:site_name\" content=\"Oracle Internals\" \/>\n<meta property=\"article:published_time\" content=\"2018-09-17T21:10:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-04-21T05:17:11+00:00\" \/>\n<meta name=\"author\" content=\"Jonah Harris\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jonahharris\" \/>\n<meta name=\"twitter:site\" content=\"@jonahharris\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jonah Harris\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/\"},\"author\":{\"name\":\"Jonah Harris\",\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4\"},\"headline\":\"Open Source ODBC Drivers for Oracle\",\"datePublished\":\"2018-09-17T21:10:54+00:00\",\"dateModified\":\"2020-04-21T05:17:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/\"},\"wordCount\":655,\"commentCount\":0,\"publisher\":{\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/\",\"url\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/\",\"name\":\"Open Source ODBC Drivers for Oracle - Oracle Internals\",\"isPartOf\":{\"@id\":\"http:\/\/oracle-internals.com\/blog\/#website\"},\"datePublished\":\"2018-09-17T21:10:54+00:00\",\"dateModified\":\"2020-04-21T05:17:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\/\/oracle-internals.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Open Source ODBC Drivers for Oracle\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/oracle-internals.com\/blog\/#website\",\"url\":\"http:\/\/oracle-internals.com\/blog\/\",\"name\":\"Oracle Internals\",\"description\":\"Researching the Inner Workings of the World&#039;s Most Powerful Database\",\"publisher\":{\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/oracle-internals.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4\",\"name\":\"Jonah Harris\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/a6d16ed0f510e8de0929f129471dc1e5?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/a6d16ed0f510e8de0929f129471dc1e5?s=96&d=mm&r=g\",\"caption\":\"Jonah Harris\"},\"logo\":{\"@id\":\"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/jonahharris\/\",\"https:\/\/x.com\/jonahharris\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Open Source ODBC Drivers for Oracle - Oracle Internals","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/","og_locale":"en_US","og_type":"article","og_title":"Open Source ODBC Drivers for Oracle - Oracle Internals","og_description":"In the good old days, database-agnostic applications were written using drivers that implemented the Microsoft Open Database Connectivity (ODBC) API, especially on Windows. Much like JDBC, ODBC provided developers with a single, interoperable,\u00a0C-based programming language interface that made it possible for applications to access data from a variety of database management systems. When developing an [&hellip;]","og_url":"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/","og_site_name":"Oracle Internals","article_published_time":"2018-09-17T21:10:54+00:00","article_modified_time":"2020-04-21T05:17:11+00:00","author":"Jonah Harris","twitter_card":"summary_large_image","twitter_creator":"@jonahharris","twitter_site":"@jonahharris","twitter_misc":{"Written by":"Jonah Harris","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/#article","isPartOf":{"@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/"},"author":{"name":"Jonah Harris","@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4"},"headline":"Open Source ODBC Drivers for Oracle","datePublished":"2018-09-17T21:10:54+00:00","dateModified":"2020-04-21T05:17:11+00:00","mainEntityOfPage":{"@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/"},"wordCount":655,"commentCount":0,"publisher":{"@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/","url":"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/","name":"Open Source ODBC Drivers for Oracle - Oracle Internals","isPartOf":{"@id":"http:\/\/oracle-internals.com\/blog\/#website"},"datePublished":"2018-09-17T21:10:54+00:00","dateModified":"2020-04-21T05:17:11+00:00","breadcrumb":{"@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/oracle-internals.com\/blog\/2018\/09\/17\/open-source-odbc-drivers-for-oracle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/oracle-internals.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Open Source ODBC Drivers for Oracle"}]},{"@type":"WebSite","@id":"http:\/\/oracle-internals.com\/blog\/#website","url":"http:\/\/oracle-internals.com\/blog\/","name":"Oracle Internals","description":"Researching the Inner Workings of the World&#039;s Most Powerful Database","publisher":{"@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/oracle-internals.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/549d9c522c3960b062618b600bb762a4","name":"Jonah Harris","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/1.gravatar.com\/avatar\/a6d16ed0f510e8de0929f129471dc1e5?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/a6d16ed0f510e8de0929f129471dc1e5?s=96&d=mm&r=g","caption":"Jonah Harris"},"logo":{"@id":"http:\/\/oracle-internals.com\/blog\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/in\/jonahharris\/","https:\/\/x.com\/jonahharris"]}]}},"_links":{"self":[{"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/posts\/93"}],"collection":[{"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/comments?post=93"}],"version-history":[{"count":3,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/posts\/93\/revisions"}],"predecessor-version":[{"id":111,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/posts\/93\/revisions\/111"}],"wp:attachment":[{"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/media?parent=93"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/categories?post=93"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/oracle-internals.com\/blog\/wp-json\/wp\/v2\/tags?post=93"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}