《oracle如何实现外部调用功能》由会员分享,可在线阅读,更多相关《oracle如何实现外部调用功能(3页珍藏版)》请在金锄头文库上搜索。
1、Oracle如何实现外部调用功能 Oralce的外部调用功能很复杂,在这里,我们只需要在存储过程中要调用一个c函数。其大致的流程如下,我们以test.c文件为例,这个c文件的内容大致如下:#includeint lp( char *text )即包含一个lp()函数。我们的目标是在存储过程中调用lp()函数。先把.c文件编译成.o文件gcc c test.c把.o文件编译成共享库文件ld G o test.so test.o通知oracle有关外部的信息 这里有一个问题,在oracle9i以前的版本中,共享库文件在操作系统中的位置是没有关系中的,可以把它放在任意一个目录下,例如可以用下面的语句
2、来创建一个testlib:create library testlib as /tmp/test.so但在9i里,可能考虑到共享库的稳定和安全性问题,这样使用话会报错如下:ORA-28595: Extproc agent : Invalid DLL Path在9i下必须把.so文件放到$ORACLE_HOME/lib目录下,并且设置环境变量EXTPROC_DLLS=$ORACLE_HOME/lib。然后创建testlib:create library testlib as $ORACLE_HOME /test.so执行这一语句需要CREATE LIBRARY系统权限。编写PL/SQL包装程序。
3、使用刚刚创建的ORACLE库,需要创建如下的PL/SQL函数:create or replace FUNCTION lp (lstr in varchar2 )return pls_integerASLANGUAGE CLIBRARY testlibNAME lpPARAMETERS (lstr STRING, return INT );/从PL/SQL调用外部过程。现在,我们可以在存储过程中调用lp()函数了,可以实现该函数原来的功能。示例如下:create or replace procedure add_test( lid in varchar2)asresult PLS_INTEGER
4、;beginresult := lp( hello world );end add_test;/ 正常情况下,你就可以通过上述的过程来在oracle存储过程中来调用一个c函数了。但是,Oracle 实现外部调用功能(external procedure),数据库需要安装intermedia,判断intermedia是否安装,需要通过tnsping 来测试一下是否配置正确。命令运行如下 tnsping extproc_connection_data 或者 tnsping extproc_connection_data.world 如果配置正确,会显示: Attempting to contact
5、 (ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC) OK(0毫秒) 如果显示服务不存在,需要重新设置listerner.ora和tnsnames.ora 增加后的内容如下: listerner.ora: DZHD = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = JSDZHD)(PORT = 1521) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC) ) ) SID_LIST_DZHD = (SID_LIS
6、T = (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) (ORACLE_HOME = /oracle/app/oracle/product/9.2.0.4) ) ) tnsnames.ora DZHD = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = T
7、CP)(HOST = JSDZHD)(PORT = 1521) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC) ) ) 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) (ORACLE_HOME = /oracle/app/oracle/product/9.2.0.4) ) )设置完毕后,需要重新启动listener. Lsnrctl stopLsnrctl start