最近项目上需要用MATLAB对服务器上的Oracle进行读写,因此研究了一下,今天记录下来。
Keywords: MATLAB;Oracle;远程连接
本文目录如下:
#1. Oracle客户端下载
由于我之前没有接触过Oracle,因此将软件的下载也放上。熟悉操作的同学可以跳过本部分。
由于我们目的是连接至其他数据库,因此只需下载Oracle客户端即可。同时因为InstantClient客户端所占体积小(大约只有full-client的1/4),因此使用InstantClient
Oracle提供了多种Client package, 这里下载basic/sqlplus/odbc. 三个package作用如下:
Package | 作用 |
---|---|
Basic | 实现OCI/OCCI/ODBC等最基本的包 |
sqlplus | 支持实现sqlplus语句及命令流 |
ODBC | 支持实现ODBC |
这里我下载的是12.2版本,该basic版本需要Microsoft Visual Studio 2013 Redistributable.
#2. Oracle Instant Client 配置
-
step1: 同时选择三个文件,将之解压至同一文件夹内,如D:\instant_client ;
-
step2: 管理员模式打开cmd,
cd至D:\instant_client,运行odbc_install.exe;双击运行也可以(此时提示oracle ODBC
Driver has been successfully
installed.此时“管理工具”中的ODBC数据源的驱动程序中就会多出来一个oracle in client_12_2) -
step3: 修改系统环境变量。
>将D:\instant_client 添加至PATH;
>新增 NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK;
>新增 TNS_ADMIN = D:\instant_client -
step4: 在D:\instant_client中新建tnsnames.ora文件,内容如下1
orcl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.26)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
其中192.168.1.26是服务器的IP地址,大家根据需要改动
PORT= 1521是默认的端口号,不需要改动
#3. 配置服务器上的监听程序和本地网络服务,参考网址
- 开始菜单中打开“Oracle Net Configuration Assistance”,选择“监听程序配置”,点击下一步;
- 选择“重新配置”;
- 选择监听程序,选择协议,默认为LISTENER,点击下一步;
- 选择TCP协议和默认的端口号;
- 是否配置另外一个监听?选择否;
- 同样的方法配置本地网络服务。
若不进行这一步,则会提示“ORA-12541: TNS: 无监听程序
#4. 添加ODBC数据源
控制面板-管理工具-ODBC数据源-系统DSN中添加oracle数据源-选择oracle in InstantClient 12.2.0, DataSourceName=ORCL2; TNS Service Name = orcl3; 并输入id和password,配置好之后会出现connection successful.
注意要关闭服务器端的防火墙
#4. matlab连接ODBC数据源
conn_odbc = database('ORCL',ID, PASSWORD)
ID和password分别是登录Oracle的账号和密码
matlab 2018连接ODBC是非常慢(大约半个小时),但是2016就没有这个问题。不知道为什么
#5 测试是否连接成功
在matlab中运行一些查询命令,通过查看返回的值,就能够判断是否连接成功。
%执行查询,单引号后面是SQL语句,用于查询数据库名称
curs = exec(conn_odbc, 'select name from v$database;');
%获取查询结果
curs = fetch(curs);
%结果输出至矩阵变量
Data = curs.Data
结果一般为ORCL,表示连接成功。
在结束查询之后,退出MATLAB之前,一定要记得关闭游标,断开MATLAB与数据库的连接。若不成功,则打开即时客户端中的sqlplus.exe,输入
id/password@ip/service_name
若提示连接到,则表明配置客户端是没有问题的。
%关闭游标
close(curs);
%在操作数据库之后一定要断开连接
close(conn_odbc);
**注意:**本人的计算机是win7 64位,Oracle版本为12.2。在win10上面装InstantClient也是可以的。