oracle呼叫C動態庫

qqmengxue發表於2010-12-09

環境介紹:

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部落格 ” ,連結:http://blog.itpub.net/10130206/viewspace-1042849/,如需轉載,請註明出處,否則將追究法律責任。

相關文章