c如何调用oracle数据,oracle调用C动态库

环境介绍:

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.soextproc.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值