您的位置:首页 > 数据库 > Oracle

Linux Centos环境下通过LuaSQL访问Oracle数据库

2017-11-27 20:38 274 查看
项目中需要在Lua程序中访问Oracle数据库,经过查找各位前辈经验及自己试验,将安装过程及使用方式总结如下:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  centos lua oracle oci8