欢迎来到天天文库
浏览记录
ID:34725032
大小:63.18 KB
页数:3页
时间:2019-03-10
《oracle如何实现外部调用功能》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Oracle如何实现外部调用功能 Oralce的外部调用功能很复杂,在这里,我们只需要在存储过程中要调用一个c函数。其大致的流程如下,我们以test.c文件为例,这个c文件的内容大致如下:#includeintlp(char*text){………}即包含一个lp()函数。我们的目标是在存储过程中调用lp()函数。先把.c文件编译成.o文件gcc–ctest.c把.o文件编译成共享库文件ld–G–otest.sotest.o通知oracle有关外部
2、的信息 这里有一个问题,在oracle9i以前的版本中,共享库文件在操作系统中的位置是没有关系中的,可以把它放在任意一个目录下,例如可以用下面的语句来创建一个testlib:createlibrarytestlibas‘/tmp/test.so’但在9i里,可能考虑到共享库的稳定和安全性问题,这样使用话会报错如下:ORA-28595:Extprocagent:InvalidDLLPath在9i下必须把.so文件放到$ORACLE_HOME/lib目录下,并且设置环境变量EXTPROC_DLLS=$OR
3、ACLE_HOME/lib。然后创建testlib:createlibrarytestlibas‘$ORACLE_HOME/test.so’执行这一语句需要CREATELIBRARY系统权限。编写PL/SQL包装程序。使用刚刚创建的ORACLE库,需要创建如下的PL/SQL函数:createorreplaceFUNCTIONlp(lstrinvarchar2)returnpls_integerAS LANGUAGEC LIBRARYtestlib NAME"lp" PARAMETERS(lstrST
4、RING,returnINT);/从PL/SQL调用外部过程。现在,我们可以在存储过程中调用lp()函数了,可以实现该函数原来的功能。示例如下:createorreplaceprocedureadd_test(lidinvarchar2 )asresultPLS_INTEGER;beginresult:=lp('helloworld');endadd_test;/ 正常情况下,你就可以通过上述的过程来在oracle存储过程中来调用一个c函数了。但是,Oracle实现‘外部调用功能’(external
5、procedure),数据库需要安装intermedia,判断intermedia是否安装,需要通过tnsping来测试一下是否配置正确。命令运行如下 tnspingextproc_connection_data或者 tnspingextproc_connection_data.world 如果配置正确,会显示: Attemptingtocontact(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC))OK(0毫秒) 如果显示服务不存在,需要重新设置lis
6、terner.ora和tnsnames.ora 增加后的内容如下: listerner.ora: DZHD= (DESCRIPTION_LIST= (DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=JSDZHD)(PORT=1521)) ) (DESCRIPTION= (ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)) )
7、 ) SID_LIST_DZHD= (SID_LIST= (SID_DESC= (GLOBAL_DBNAME=dzhd) (ORACLE_HOME=/oracle/app/oracle/product/9.2.0.4) (SID_NAME=dzhd) ) (SID_DESC= (PROGRAM=extproc) (SID_NAME=PLSExtProc) (
8、ORACLE_HOME=/oracle/app/oracle/product/9.2.0.4) ) ) tnsnames.ora DZHD= (DESCRIPTION_LIST= (DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=JSDZHD)(PORT
此文档下载收益归作者所有