Linux Centos环境下通过LuaSQL访问Oracle数据库
2017-11-27 20:38
274 查看
项目中需要在Lua程序中访问Oracle数据库,经过查找各位前辈经验及自己试验,将安装过程及使用方式总结如下:
1. 安装Lua(5.1及以上)
2. 安装Oracle client(这里使用12.1)
下载oracle-instantclient12.1-devel-12.1.0.1.0-1.x86_64 和 oracle-instantclient12.1-basic-12.1.0.1.0-1.x86_64
记得设置ORACLE_HOME环境变量
3. 安装luarocks
luarocks是安装luasql的工具
4. 安装luasql-oci8
oci8是luasql中支持oracle的接口库
安装luasql-oci8的过程中可能会遇到缺少 so 链接库的情况,造成这个的原因大多是因为安装的oracle client的lib目录不在安装程序默认扫描路径中,
这时候可以通过 find / -name xxx.so 找到该so,再将其复制到默认路径中,如:
luasql-oci8安装成功后会出现:
gcc -O2 -fPIC -I/usr/local/include -c src/luasql.c -o src/luasql.o -I/usr/include/oracle/12.1/client64/
gcc -O2 -fPIC -I/usr/local/include -c src/ls_oci8.c -o src/ls_oci8.o -I/usr/include/oracle/12.1/client64/
gcc -shared -o luasql/oci8.so -L/usr/local/lib src/luasql.o src/ls_oci8.o -L/usr/local/lib -Wl,-rpath,/usr/local/lib: -lz -lclntsh
luasql-oci8 2.3.0-1 is now installed in /usr/local (license: MIT/X11)
5. 测试lua连接oracle程序:
在我自己的应用场景中,Oracle Client连接另一台服务器上的Oracle Server,并且LuaSQL的connect方法需要提供servicename,因此要在$ORACLE_HOME/network/admin
下自己建立一个tnsnames.ora文件,将servicename与Oracle Server的配置联系起来。
另外,可以使用telnet ip port 来测试Oracle Client是否和Oracle Server是否连通,如果无法连通,要打开Oracle Server上的防火墙。
执行程序时可能会遇到以下错误:
lua: error loading module 'luasql.oci8' from file '/usr/local/lib/lua/5.3/luasql/oci8.so':
libnnz12.so: cannot open shared object file: No such file or directory
解决方案:
最后,对于使用luasql.oci8执行存储过程有几点需要注意的:
(1) 不支持prepared statement,即不能绑定变量。因此,存储过程中的返回值无法在lua中获取。只能得到存储过程是否被执行的返回值cur,1.0为执行成功, nil为执行失败;
(2) 存储过程的入参通过字符串连接写入,如果是varchar2类型的入参,切记在拼接字符串时在入参两端用 单引号 ‘ 包住。见下面例子中的accoount参数。
正是由于luasql.oci8无法获得存储过程的返回值,因此最后放弃了这个方案。(不太甘心,总觉得还有别的办法,奈何工期紧张,只好放下)
以上是我自己试验的结果,欢迎大家批评指正。
附上luasql的文档连接(网上关于luasql的例子,特别是连接oracle数据库的例子十分稀少)
http://math2.org/luasearch/luasql.html http://realtimelogic.com/ba/doc/en/lua/luasql.html
1. 安装Lua(5.1及以上)
curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gz tar -zxvf lua yum install readline-devel make linux test make install
2. 安装Oracle client(这里使用12.1)
下载oracle-instantclient12.1-devel-12.1.0.1.0-1.x86_64 和 oracle-instantclient12.1-basic-12.1.0.1.0-1.x86_64
rpm -Uvh oracle-instantclient12.1-basic-12.1.0.1.0-1.x86_64.rpm rpm -Uvh oracle-instantclient12.1-devel-12.1.0.1.0-1.x86_64.rpm
记得设置ORACLE_HOME环境变量
3. 安装luarocks
luarocks是安装luasql的工具
wget https://luarocks.org/releases/luarocks-2.4.3.tar.gz tar zxpf luarocks-2.4.3.tar.gz cd luarocks-2.4.3 ./configure; sudo make bootstrap
4. 安装luasql-oci8
oci8是luasql中支持oracle的接口库
luarocks install luasql-oci8 OCI8_INCDIR=/usr/include/oracle/12.1/client64/
安装luasql-oci8的过程中可能会遇到缺少 so 链接库的情况,造成这个的原因大多是因为安装的oracle client的lib目录不在安装程序默认扫描路径中,
这时候可以通过 find / -name xxx.so 找到该so,再将其复制到默认路径中,如:
cp /usr/lib/oracle/12.1/client64/lib/libclntsh.so.12.1 /usr/local/lib/libclntsh.so
luasql-oci8安装成功后会出现:
gcc -O2 -fPIC -I/usr/local/include -c src/luasql.c -o src/luasql.o -I/usr/include/oracle/12.1/client64/
gcc -O2 -fPIC -I/usr/local/include -c src/ls_oci8.c -o src/ls_oci8.o -I/usr/include/oracle/12.1/client64/
gcc -shared -o luasql/oci8.so -L/usr/local/lib src/luasql.o src/ls_oci8.o -L/usr/local/lib -Wl,-rpath,/usr/local/lib: -lz -lclntsh
luasql-oci8 2.3.0-1 is now installed in /usr/local (license: MIT/X11)
5. 测试lua连接oracle程序:
luasql=require"luasql.oci8" --创建环境对象 env=assert(luasql.oci8()) --连接数据库 conn=assert(env:connect("servicename","user","password")) aa="201" --执行数据库操作 cur=conn:execute("select id,account from tmp_table where id="..aa) row=cur:fetch({},"a") while row do var=string.format("%d,%d\n",row.id,row.account) print(var) row=cur:fetch(row,"a") end cur:close() conn:close()--关闭数据库连接 env:close()--关闭数据库环境
在我自己的应用场景中,Oracle Client连接另一台服务器上的Oracle Server,并且LuaSQL的connect方法需要提供servicename,因此要在$ORACLE_HOME/network/admin
下自己建立一个tnsnames.ora文件,将servicename与Oracle Server的配置联系起来。
另外,可以使用telnet ip port 来测试Oracle Client是否和Oracle Server是否连通,如果无法连通,要打开Oracle Server上的防火墙。
执行程序时可能会遇到以下错误:
lua: error loading module 'luasql.oci8' from file '/usr/local/lib/lua/5.3/luasql/oci8.so':
libnnz12.so: cannot open shared object file: No such file or directory
解决方案:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/oracle/12.1/client64/lib
最后,对于使用luasql.oci8执行存储过程有几点需要注意的:
(1) 不支持prepared statement,即不能绑定变量。因此,存储过程中的返回值无法在lua中获取。只能得到存储过程是否被执行的返回值cur,1.0为执行成功, nil为执行失败;
(2) 存储过程的入参通过字符串连接写入,如果是varchar2类型的入参,切记在拼接字符串时在入参两端用 单引号 ‘ 包住。见下面例子中的accoount参数。
luasql=require"luasql.oci8" --创建环境对象 env=assert(luasql.oci8()) --连接数据库 conn=assert(env:connect("servicename","user","password")) account="test0001" return_code=99 statement="declare return_code integer; \ begin \ return_code:=package.valid_user('"..account.."'); \ end;" --执行数据库操作 cur=conn:execute(statement2) return_code=cur print(return_code) conn:close()--关闭数据库连接 env:close()--关闭数据库环境
正是由于luasql.oci8无法获得存储过程的返回值,因此最后放弃了这个方案。(不太甘心,总觉得还有别的办法,奈何工期紧张,只好放下)
以上是我自己试验的结果,欢迎大家批评指正。
附上luasql的文档连接(网上关于luasql的例子,特别是连接oracle数据库的例子十分稀少)
http://math2.org/luasearch/luasql.html http://realtimelogic.com/ba/doc/en/lua/luasql.html
相关文章推荐
- SERVER 2008 R2 环境下,SQL 2008R2 通过链接服务器访问 ORACLE 8i 数据库的详细教程
- 在Java程序中,通过JDBC访问Oracle数据库的步骤
- 怎么通过sql语句访问另外一个库的内容
- 通过使用主机中的sqldeveloper访问虚拟机中的oracle数据库
- 通过系统表获取SQL,Access,Oracle数据库的元数据信息
- 浅析Windows通过ODBC访问linux的Oracle数据库
- apache -- 利用mod_access通过设置环境变量限制特定用户的访问
- 在别人的机器上使用IP通过SQL Server Authentication来访问自己的数据库
- 环境变量配置完毕,但是通过localhost或localhost:8080访问出现404
- 在云服务器上搭建JSP环境并发布web项目(通过域名访问自己写的项目)
- 通过存储过程访问SQL数据
- windows下通过VNC图形化访问Ubuntu桌面环境
- pl sql developer 通过oracle客户端连接远程oracle数据库
- Linux---windows下通过VNC图形化访问Ubuntu桌面环境
- windows下通过VNC图形化访问Ubuntu桌面环境
- Oracle数据库的通过sqlplus命令行登录的几种方式
- 通过.NET访问Oracle数据库
- windows下通过VNC图形化访问Ubuntu桌面环境
- PHP+OCI访问Oracle数据库时的字符集设置--sqlplus乱码解决
- PL/SQL developer 通过简易客户端链接oracle数据库