Connect to Oracle DB from Clojure
15 April 2020
I need to analyze data from Oracle database in Clojure, and come across some error. Here is the solutions to the problems.
1 No suitable driver found
The first problem is no oracle database driver:
Syntax error (SQLException) compiling at (C:\cygwin64\tmp\form-init16410964815710271710.clj:1:88). No suitable driver found for jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521
The solution:
1.1 download Oracle jdbc driver
Download "ojdbc8.jar" from:
https://www.oracle.com/database/technologies/jdbc-ucp-122-downloads.html
1.2 add lein-localrepo plugin to leiningen profiles
In ~/.lein/profiles.clj, add:
{:user { :plugins [[lein-localrepo "0.5.4"]] } }
1.3 install oracledriver
$ lein localrepo install ~/downloads/ojdbc8.jar oracle.jdbc/oracledriver "12.1.0.1"
1.4 add dependencies in project.clj
:dependencies [[org.clojure/clojure "1.10.1"] [org.clojure/java.jdbc "0.7.11"] [oracle.jdbc/oracledriver "12.1.0.1"]] <--
2 No service found
Syntax error (NetException) compiling at (C:\cygwin64\tmp\form-init628084108377043642.clj:1:86). Listener refused the connection with the following error: ORA-12504, TNS:listener was not given the SID in CONNECT_DATA
You need to find the SERVICE_NAME from tnsnames.ora:
TEST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = *<servicenamefromDB>*) ) )
defin the db-spec as:
(def db-spec {:classname "oracle.jdbc.OracleDriver" :subprotocol "oracle" :subname "@*<validhost>*:*<validport>*/*<servicenamefromDB>*" :user "username" :password "password"})