Oracle 中调用外部C动态库函数
分类: Oracle

2016-08-20 05:24:52

原文地址:Oracle 中调用外部C动态库函数 作者:libydwei2007

由于项目为了缩短开发时间,要在Oracle中调用外部已经开发好的C程序。
查找了网上的一些帖子,再结合实际总结这篇文章。希望对大家有所帮助。
参考文章:http://www.cnblogs.com/mathitlin99/archive/2013/09/05/3303717.html

首先编译外部动态库<span "="">libDialPlan.so

点击(此处)折叠或打开

  1. gcc -fPIC -c LibDialPlan.cpp
  2. gcc -shared -o libDialPlan.so LibDialPlan.o -lstdc++

修改Oracle TNS文件和监听文件。
不清楚大家直接拷贝是否可用。如果有问题,请注意一下等号以及括号两边的空格。
tnsnames.ora

点击(此处)折叠或打开

  1. ORADB =
  2. (DESCRIPTION =
  3. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.69.166)(PORT = 1521))
  4. (CONNECT_DATA =
  5. (SERVER = DEDICATED)
  6. (SERVICE_NAME = oradb)
  7. )
  8. )
  9. EXTPROC_CONNECTION_DATA=
  10. (DESCRIPTION=
  11. (ADDRESS_LIST=
  12. (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
  13. )
  14. (CONNECT_DATA=
  15. (SID = PLSExtProc)
  16. (PRESENTATION = RO)
  17. )
  18. )

listener.ora

点击(此处)折叠或打开

  1. LISTENER =
  2. (DESCRIPTION_LIST =
  3. (DESCRIPTION =
  4. (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
  5. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.69.166)(PORT = 1521))
  6. )
  7. )
  8. ADR_BASE_LISTENER = /home/oracle/db/app
  9. SID_LIST_LISTENER =
  10. (SID_LIST =
  11. (SID_DESC =
  12. (GLOBAL_DBNAME = oradb)
  13. (SID_NAME = oradb)
  14. )
  15. (SID_DESC=
  16. (SID_NAME = PLSExtProc)
  17. (ORACLE_HOME = /opt/local/oracle/app/product/11.2.0/dbhome_2)
  18. (ENVS = EXTPROC_DLLS=ANY)
  19. (PROGRAM = extproc)
  20. )
  21. )

修改后重启监听:lsnrctl stop ;lsnrctl start
查看监听状态,应该出现如下的监听项:PLSExtProc<span "=""> 

点击(此处)折叠或打开

  1. [root@localhost admin]# lsnrctl status
  2. LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 04-AUG-2016 19:33:50
  3. Copyright (c) 1991, 2009, Oracle. All rights reserved.
  4. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
  5. STATUS of the LISTENER
  6. ------------------------
  7. Alias LISTENER
  8. Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
  9. Start Date 04-AUG-2016 16:23:54
  10. Uptime 0 days 3 hr. 9 min. 55 sec
  11. Trace Level off
  12. Security ON: Local OS Authentication
  13. SNMP OFF
  14. Listener Parameter File /opt/local/oracle/app/product/11.2.0/dbhome_2/network/admin/listener.ora
  15. Listener Log File /opt/local/oracle/app/product/11.2.0/dbhome_2/network/log/listener.log
  16. Listening Endpoints Summary...
  17. (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  18. (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.69.166)(PORT=1521)))
  19. Services Summary...
  20. Service "PLSExtProc" has 1 instance(s).
  21. Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
  22. Service "oradb" has 1 instance(s).
  23. Instance "oradb", status UNKNOWN, has 1 handler(s) for this service...
  24. The command completed successfully
  25. [root@localhost admin]#

创建Oracle  library 对象

点击(此处)折叠或打开

  1. create or replace library hytpdtbilldb.Fun_Ext_Proc
  2. as '/opt/local/Oracle_install/Oracle_Call_External_C/libDialPlan.so';

创建函数
1)按照网上的文章,还有一个parameter的参数。
但是我加入这个参数后一直不能编译通过。去掉后并未影响函数的使用。
2)数字和字符串对应的是binary_integer,varchar2类型。本来C的入参是需要数组类型,但是Oracle没有真正的数组,只能通过字符串代替。
3)在我测试的过程中,偶尔需要重启才能正常调用函数。大家使用的过程中可以留意一下。

点击(此处)折叠或打开

  1. create or replace function hytpdtbilldb.Air2Gsi
  2. (x binary_integer,y varchar2)
  3. return varchar2
  4. as
  5. language C
  6. library hytpdtbilldb.Fun_Ext_Proc
  7. name "Air2Gsi";
  8. /

转载于:https://www.cnblogs.com/buffercache/p/11446224.html

Oracle 中调用外部C动态库函数相关推荐

  1. 如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)

    如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...

  2. CDR插件开发之CPG插件018 - 在CPG插件中调用外部EXE程序并传递参数

    在上篇文章中,讲解了CPG插件在VS2019中实现调试的具体方法.本文以具体代码为例,讲解在CPG插件中调用外部EXE程序,并传递运行参数的方法. 工程搭建准备 按照惯例,本篇文章的序号为018,请直 ...

  3. vue实例中调用外部js_vue中引入外部js方法实例

    我们在做vue项目时,经常会需要引入js,常用的有以下几种.本文主要和大家分享vue中引入外部js方法实例,希望能帮助到大家. 第一种import XX from "路径" Vue ...

  4. 在Delphi中调用外部DLL 之External DLL 导入DLL

    调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. unit Unit1;interfaceu ...

  5. phpcms中调用外部网站数据

    1.在phpcms后台模块->模块管理->数据源->外部数据源 中 添加外部数据源 2.在phpcms前台模板中,使用get标签获取数据源中数据.{pc:get sql=" ...

  6. 在汇编程序中调用C语言的库函数,h转inc

    在汇编语言中如果能够调用C语言的库函数,有时会很方便 先给个示例程序: .386 .model flat,stdcall option casemap:none ;Include定义 include ...

  7. 在Salesforce中调用外部系统所提供的的Web Service

    这里需要提供外部service所对应的WSDL文件(Salesforce只支持从本地上传),并且提供的WSDL文件有如下两点要求: 1):wsdl 文件只能有一个binding,Salesforce是 ...

  8. oracle中调用过程,oracle中如何调用存储过程

    oracle中如何调用存储过程 发布时间:2020-03-08 03:28:03 来源:51CTO 阅读:511 作者:lxg290 一.通过pls块来调用存储过程: declare p_dzno v ...

  9. python init函数可以外部调用么,如何从python类中调用外部函数

    我试图收集通过套接字解析的数据.这是我的密码:import pickle import SocketServer class SocketReciever(SocketServer.BaseReque ...

最新文章

  1. Linux操作系统及平台虚拟化技术漫谈
  2. .Net Discovery 系列之九--string从入门到精通(勘误版下)
  3. 基于visual graph开发实时线损管理系统
  4. Django框架(5.django中模型类建立关系和多表关系查询)
  5. 复旦高等代数 II(17级)每周一题
  6. “新基建”横空出世,9本书助你把握7+2大领域风口
  7. 由两个问题引发的对GaussDB(DWS)负载均衡的思考
  8. 遍历对象和数组的forEach函数
  9. CENTOS上编译FreeSwitch
  10. SpringBoot项目文件下载
  11. 标题组合-标题组合软件-免费标题生成组合软件
  12. uppy JavaScript 文件上传
  13. STM8L052低功耗模式
  14. javamail 邮件发送、带格式、已保存
  15. 彻底解决360安全卫士广告问题-终极解决方案(含360后台广告程序下载解决方案)
  16. 狐狸找兔子 ← C语言实现
  17. 循序渐进Linux目录
  18. 在线制作名片php,关于一个名片在线制作的问题,求高手指点阿..
  19. 4G DTU和4G工业路由器有哪些区别?
  20. 微信跳一跳python_用python来玩微信跳一跳

热门文章

  1. mysql容器重启数据是否丢失_docker容器重启 数据会丢吗
  2. 田忌赛马贪心算法_acm田忌赛马问题在线等急求!!
  3. vue中this.init用法_Vue中的this.$options.data()和this.$data用法说明
  4. PyTorch 1.9发布!移动端疯狂更新
  5. 一图搞定ML!2020版机器学习技术路线图,35页ppt
  6. 一文带你读懂Self-Supervised Learning(自监督学习)
  7. 卷王李富贵算法每日一题--分治算法(四)--循环比赛
  8. NLP系列学习:CRF条件随机场(1)
  9. 关于文件整理的一些心得
  10. android属性动画作用范围,Android 属性动画:这是一篇全面 详细的 属性动画 总结攻略...