ITPub博客

首页 > 数据库 > Oracle > oracle调用C动态库

oracle调用C动态库

原创 Oracle 作者:qqmengxue 时间:2010-12-09 16:38:27 0 删除 编辑

环境介绍:

ORACLE10.2.0.1 64BIT

REDHAT 5.3 64BIT

[@more@]

有时候为了提高数据库的运行速度已经调用第三方的其他接口就难免需要在oracle内部调用其他的接口来完成操作,在此简单的介绍下通过oracle调用C的动态库实现的一些操作。

创建C文件:

1、extproc.c

int sysrun(int *command)

{

return command;

}

2、执行编译

/usr/bin/gcc -fPIC -c -I/u01/app/10.2.1/db_1/rdbms/demo -I/u01/app/10.2.1/db_1/rdbms/public -I/u01/app/10.2.1/db_1/plsql/public -I/u01/app/10.2.1/db_1/network/public -I/u01/app/10.2.1/db_1/precomp/public myalib.c -DLINUX -DORAX86_64 -D_GNU_SOURCE -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT -DNS_THREADS -DLONG_IS_64 -fno-strict-aliasing -DSS_64BIT_SERVER

/usr/bin/gcc -shared -L/u01/app/10.2.1/db_1/lib -o myalib.so myalib.o

或者直接运行make进行编译:

make -f $ORACLE_HOME/rdbms/demo/demo_rdbms.mk extproc_no_context SHARED_LIBNAME=extproc.so
OBJS=extproc.o
或者
gcc -O -fpic -shared -o extproc.so extproc.c

执行完后会生成extproc.so文件,这也就是我们的动态库。

3、创建library:

SQL> create or replace library MYLIB
2 as '/u01/app/10.2.1/db_1/bin/extproc.so';

Library created

4、创建函数:

SQL> create or replace function sysrun (syscomm in double precision)
2 return double precision
3 as language C -- Use "as external" for older Oracle releases
4 name "sysrun"
5 library mylib
6 parameters(syscomm double,return double);
7
8 /

Function created

5、调用:

SQL> select sysrun(11) from dual;

SYSRUN(11)
----------
11

错误解决:

在运行的时候可能会遇到:

ORACLE10G:

ORA-06520: PL/SQL: Error loading external library
ORA-06522: extproc.so: only ET_DYN and ET_EXEC can be loaded


ORACLE9I:

ORA-06520: PL/SQL: Error loading external library
ORA-06522: extproc.so: ELF file's phentsize not the expected size

错误原因:

可能你使用的动态库本身只是一个对象文件,并不是一个动态库,如下,如果你是使用以下命令创建 的.so文件:

cc -c extproc.c -o extproc.so

事实上以上命令创建的是一个后缀名为.so的普通文件,我们可以执行以下命令来验证:

[oracle@qqdb c_lib]$ file myalib.o
myalib.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped

如果执行正确的动态库编译命令:

make -f $ORACLE_HOME/rdbms/demo/demo_rdbms.mk extproc_no_context SHARED_LIBNAME=extproc.so
OBJS=extproc.o

再重新执行以上命令会提示:

file extproc.so
extproc.so: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), not stripped

一个其他的途径来创建动态库:

cc -c extproc.so

这个命令将会创建一个普通的.o文件,然后再创建动态共享库:

cc -shared extproc.o -o extproc.so

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10130206/viewspace-1042849/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-26

  • 博文量
    169
  • 访问量
    589152