由于项目为了缩短开发时间,要在Oracle中调用外部已经开发好的C程序。
查找了网上的一些帖子,再结合实际总结这篇文章。希望对大家有所帮助。
参考文章:http://www.cnblogs.com/mathitlin99/archive/2013/09/05/3303717.html
首先编译外部动态库libDialPlan.so
-
gcc -fPIC -c LibDialPlan.cpp
-
gcc -shared -o libDialPlan.so LibDialPlan.o -lstdc++
修改Oracle TNS文件和监听文件。
不清楚大家直接拷贝是否可用。如果有问题,请注意一下等号以及括号两边的空格。
tnsnames.ora
-
ORADB =
-
(DESCRIPTION =
-
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.69.166)(PORT = 1521))
-
(CONNECT_DATA =
-
(SERVER = DEDICATED)
-
(SERVICE_NAME = oradb)
-
)
-
)
-
-
EXTPROC_CONNECTION_DATA=
-
(DESCRIPTION=
-
(ADDRESS_LIST=
-
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
-
)
-
(CONNECT_DATA=
-
(SID = PLSExtProc)
-
(PRESENTATION = RO)
-
)
-
)
listener.ora
-
LISTENER =
-
(DESCRIPTION_LIST =
-
(DESCRIPTION =
-
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
-
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.69.166)(PORT = 1521))
-
)
-
)
-
-
ADR_BASE_LISTENER = /home/oracle/db/app
-
-
-
SID_LIST_LISTENER =
-
(SID_LIST =
-
(SID_DESC =
-
(GLOBAL_DBNAME = oradb)
-
(SID_NAME = oradb)
-
)
-
(SID_DESC=
-
(SID_NAME = PLSExtProc)
-
(ORACLE_HOME = /opt/local/oracle/app/product/11.2.0/dbhome_2)
-
(ENVS = EXTPROC_DLLS=ANY)
-
(PROGRAM = extproc)
-
)
-
)
修改后重启监听:lsnrctl stop ;lsnrctl start
查看监听状态,应该出现如下的监听项:PLSExtProc
-
[root@localhost admin]# lsnrctl status
-
-
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 04-AUG-2016 19:33:50
-
-
Copyright (c) 1991, 2009, Oracle. All rights reserved.
-
-
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
-
STATUS of the LISTENER
-
------------------------
-
Alias LISTENER
-
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
-
Start Date 04-AUG-2016 16:23:54
-
Uptime 0 days 3 hr. 9 min. 55 sec
-
Trace Level off
-
Security ON: Local OS Authentication
-
SNMP OFF
-
Listener Parameter File /opt/local/oracle/app/product/11.2.0/dbhome_2/network/admin/listener.ora
-
Listener Log File /opt/local/oracle/app/product/11.2.0/dbhome_2/network/log/listener.log
-
Listening Endpoints Summary...
-
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
-
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.69.166)(PORT=1521)))
-
Services Summary...
-
Service "PLSExtProc" has 1 instance(s).
-
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
-
Service "oradb" has 1 instance(s).
-
Instance "oradb", status UNKNOWN, has 1 handler(s) for this service...
-
The command completed successfully
-
[root@localhost admin]#
创建Oracle library 对象
-
create or replace library hytpdtbilldb.Fun_Ext_Proc
-
as '/opt/local/Oracle_install/Oracle_Call_External_C/libDialPlan.so';
-
创建函数
1)按照网上的文章,还有一个parameter的参数。
但是我加入这个参数后一直不能编译通过。去掉后并未影响函数的使用。
2)数字和字符串对应的是binary_integer,varchar2类型。本来C的入参是需要数组类型,但是Oracle没有真正的数组,只能通过字符串代替。
3)在我测试的过程中,偶尔需要重启才能正常调用函数。大家使用的过程中可以留意一下。
-
create or replace function hytpdtbilldb.Air2Gsi
-
(x binary_integer,y varchar2)
-
return varchar2
-
as
-
language C
-
library hytpdtbilldb.Fun_Ext_Proc
-
name "Air2Gsi";
-
/
-
阅读(3301) | 评论(0) | 转发(0) |