R语言连接数据库可以利用数据库的存贮能力和R的计算能力,起到取长补短的效果。接下来探讨如何用R连接Oracle数据库。
一、Oracle Database Instant Client
Oracle Database Instant Client 是用来连接远程服务器的,这样自己的电脑就不需要安装oracle数据库,因为oracle数据库太大,要求配置比较高。Oracle Database Instant Client 目前是分32位和64位的,下载安装需要清除自己的电脑是32位还是64位,下载对应的版本。
1) 从oracle官方网站下载instant client文件,一般来说,有basic、odbc,就足够用的了(其中basic是必须的,其他的自己根据需求下载):
instantclient-basic-windows.x64-12.1.0.2.0.zip
instantclient-odbc-windows.x64-12.1.0.2.0.zip
instantclient-sdk-windows.x64-12.1.0.2.0.zip
2) 将以上压缩包解压到同一个文件夹中,如D:\Oracle\instantclient_12_1,设置环境变量
1. ORACLE_HOME = D:\Oracle\instantclient_12_1
2. TNS_ADMIN = D:\Oracle\instantclient_12_1
3. NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK (可以不用设置)
4. 修改Path变量,添加 %ORACLE_HOME%
3) 在D:\Oracle\instantclient_12_1中新建一个tnsnames.ora文件,环境变量TNS_ADMIN就是指向tnsnames.ora所在目录的。
ORACLE=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.6.0.46)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
其中红线加粗的三个地方需要根据自己的实际情况进行更改
ORACLE —— 远程数据库的连接字符串
10.6.0.46 —— 远程数据库所在机器IP
orcl ——远程数据库名称
4)双击安装目录下的odbc_install.exe
5)打开控制面板,进入管理工具
由于下载的是64位的,双击ODBC数据源(64位),点击添加
选择Oracle in instantclient_12_1,点击完成,接着会需要填写一些项:
①Data Source Name 一项填入你要使用的名字,自己随便命名,例如:DSN;
②Description一项随意填写(可以不填),例如mydata
③TNS Service Name :远程数据库的连接字符串,会自动在tnsnames.ora中找到(设置了环境变量才找得到),点击右侧的向下的箭头就可以找到之前在tnsnames.ora设置的远程数据库的连接字符串ORACLE
④ User ID : Oracle用户名
至此,Oracle Database Instant Client 安装并配置完成。
二、R中连接Oracle数据库
1)安装RODBC,install.package("RODBC")
2 ) 加载RODBC包,library(RODBC)
3 ) 连接数据库,channel <- odbcConnect("DSN", uid="abc", pwd="abc")
注: 连接数据库可能出现以下问题
Warning messages: 1: In odbcDriverConnect("DSN=DSN;UID=jincz;PWD=jinchongzi", readOnlyOptimize = TRUE) : [RODBC] ERROR: state IM014, code 0, message [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配 2: In odbcDriverConnect("DSN=DSN;UID=jincz;PWD=jinchongzi", readOnlyOptimize = TRUE) : ODBC connection failed
可能原因:
①由于R的位数和Oracle Database Instant Client的位数(或者说是ODBC数据源位数)不同导致的,Oracle Database Instant Client的位数为64位,则R也要设置为64位。
设置方式:点击Tools -> Global options -> 修改R version
②由于ODBC数据源未设置导致。