erlang-db-driver是北京融易通公司開源的一個erlang支持眾多數據庫的一個驅動類庫,據其wiki介紹,其支持MySQL, Oracle, Sybase, DB2 and Informix,功能不可不説強勁。

公司的業務支持oracle,使用的是odbc方法,為了提高性能,特轉換為使用erlang-db-driver。在使用的過程中,遇到了很多問題,不過通過郵件跟融易通公司的工程師聯繫,得到了他們的快速回復,解決了不少問題。本文是集合了我們聯繫的郵件而形成的一個概括文檔。如果你們在使用erlang-db-driver有問題,不妨給他們發郵件,他們是很樂意解決你們的問題的。

1.安裝Oracle Database Instant Client

在oracle客户端類庫中下載安裝需要的類庫,其中必須的是Basic、devel2個文件。也可以安裝SQL PLUS文件,可以通過命令行來連接oracle服務器。

2.鏈接動態類庫

安裝的類庫在/usr/lib,要使我們的程序連接到oracle類庫,我們要執行下面命令:

cd /usr/lib/oracle/12.1/client/lib
pwd >> /etc/ld.so.conf
ldconfig

設置環境變量

export ORACLE_HOME=/usr/lib/oracle/12.1/client

第2步到現在,基於一個假設,即oracle的客户端和服務器端是在不同的主機上的。

如果oracle的客户端和服務器端是在相同的主機上的,可以設置erlang-db-driver裏面的build/oracle.config文件。

{check_envs, [

    "ORACLE_HOME"

]}.

 

{include_search_dirs, [

    "${ORACLE_HOME}",

    "/usr/include/oracle/",

    "/usr/local/include/oracle",

    "/usr/local/oracle/include",

    "/opt/local/include/oracle"

]}.

 

{include_files, [

    "occi.h"

]}.

 

{lib_search_dirs, [

    "${ORACLE_HOME}/lib",

    "${ORACLE_HOME}"

]}.

 

{lib_files, [

    "occi",

    "clntsh"

]}.

 

{cflags, "-DUSE_ORACLE"}.

 

{srcs, ["c_src/oracle/*.cpp"]}.

 

你可以將裏面的ORACLE_HOME改成客户端的路徑,然後重新編譯。

 

3.下載編譯erlang-db-driver項目

準備階段,安裝erlang-db-driver編譯需要的文件:

yum install git doxygen graphviz

下載erlang-db-driver

git clone https://github.com/denglf/erlang-db-driver

編譯安裝:

cd erlang-db-driver
./configure --with-oracle
make 
make docs
make installl

至此,erlang-db-driver安裝完畢。

 

4.配置tnsnames.ora文件

配置tnsnames.ora跟odbc連接oracle的方式很像。

oracle的連接配置在配置文件中
$ORACLE_HOME/network/admin/tnsnames.ora
內容如下:
MY_DB_CONNECTION =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.95)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

對應命令行,你可以通過下面的命令連接oracle數據庫:

sqlplus SYSTEM/123456@192.168.0.95:1521/XE

連接參數如下:
[
{default_pool, true},
{table_info, true},
{driver, oracle},
{host, ""},
{port, 1521},
{user, "SYSTEM"},
{password, "123456"},
{database, "MY_DB_CONNECTION"}, %% 這裏是配置文件裏所配的名稱
{poolsize, 8}]

erl
1>db_app:start().
2>ConnArg = [
    {default_pool, true},
    {table_info, true},
    {driver, oracle},
    {host, ""},
    {port, 1521},
    {user, "SYSTEM"},
    {password, "123456"},
    {database, "MY_DB_CONNECTION"}, 
    {poolsize, 8}].
3> db_app:add_pool(xell, ConnArg).

這樣就可以連接oracle數據庫了。

5.在64位系統下找不到erlang_interface

上面使用的系統的是32位的centos,如果是64位的系統,要使用下面的命令來規避這個問題。

cd /usr/local/lib64 && ln -s /usr/local/lib/erlang .

可以看這裏瞭解這個問題。

6.插入日期數據。

假設有個簡單表,ss表定義只有date數據類型

CREATE TABLE    ss (  
    toptime date NOT NULL   
);

可以使用下面的語句插入數據:

db_app:execute_sql("insert into ss(toptime) values( to_date('2013-12-5 10:3:9', 'YYYY-MM-DD HH24:MI:SS'))").

也可以這樣:

db_app:insert(ss, [{toptime,{"datetime", {{2013, 12, 5}, {2,3,4}}}}]).