Calling external C dynamic library functions in Oracle
In order to shorten the development time, the project must call the C program that has been developed externally in Oracle.
I found some posts on the Internet and summarized the article based on the actual situation. Hope to help you.
Reference: http://www.cnblogs.com/mathitlin99/archive/2013/09/05/3303717.html
First, compile the external dynamic library libDialPlan. so
- gcc -fPIC -c LibDialPlan.cpp
- gcc -shared -o libDialPlan.so LibDialPlan.o -lstdc++
Modify the Oracle TNS file and listener file.
It is unclear whether the direct copy is available. If you have any questions, pay attention to the equal sign and the spaces on both sides of the brackets.
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)
- )
- )
Restart the listener after modification: lsnrctl stop; lsnrctl start
Check the listening status. The following listening items should appear: 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]#
Create Oraclelibrary object
- create or replace library hytpdtbilldb.Fun_Ext_Proc
- as '/opt/local/Oracle_install/Oracle_Call_External_C/libDialPlan.so';
Create a function
1) According to the online article, there is also a parameter.
However, this parameter cannot be compiled after I add it. The removed function does not affect the use of the function.
2) The numbers and strings correspond to the binary_integer and varchar2 types. Originally, input parameters of C require array type, but Oracle does not have a real array and can only be replaced by strings.
3) during my testing, I occasionally need to restart to call the function normally. Pay attention to the usage process.
- create or replace function hytpdtbilldb.Air2Gsi
- (x binary_integer,y varchar2)
- return varchar2
- as
- language C
- library hytpdtbilldb.Fun_Ext_Proc
- name "Air2Gsi";
- /