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.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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java動態呼叫c++庫JavaC++
- java呼叫c++動態庫之jni呼叫JavaC++
- C語言動態呼叫庫(轉)C語言
- C#呼叫C++動態連結庫C#C++
- C++呼叫C#的動態庫dllC++C#
- C#動態呼叫webserviceC#Web
- P/Invoke之C#呼叫動態連結庫DLLC#
- golang可以呼叫C++的動態連結庫麼GolangC++
- C#動態呼叫WCF介面C#
- lua——alien庫實現lua呼叫C動態連結庫(dll、so)
- VB呼叫C程式的方法—動態連結庫法 (轉)C程式
- 動態庫的建立和呼叫
- linuxjna呼叫so動態庫Linux
- linux下使用boost.python呼叫c++動態庫LinuxPythonC++
- JNI呼叫c動態連結庫函式程式碼實踐函式
- C++動態庫封裝C#庫,驗證動態庫環境C++封裝C#
- VS中呼叫DLL動態庫的方法
- Oracle 迴圈呼叫動態SQL語句OracleSQL
- (C#)利用反射動態呼叫類成員C#反射
- 作業系統動態庫呼叫過程作業系統
- C++靜態庫與動態庫深入研究C++
- .net呼叫靜態庫
- java動態呼叫webserviceJavaWeb
- VC動態呼叫DLL
- 深入理解C語言----動態庫 & 靜態庫 & 連結C語言
- Laravel 如何實現既能靜態呼叫,又能動態呼叫Laravel
- Linux迭代呼叫共享動態庫導致segment faultLinux
- 【PB】powerbuilder呼叫VC編寫的動態連結庫UI
- Java呼叫C/C++編寫的第三方dll動態連結庫(非nativeAPI)—JNIJavaC++API
- C++原始碼免殺之函式的動態呼叫C++原始碼函式
- C#呼叫IronPython動態執行Python程式碼C#Python
- 物件呼叫動態變數物件變數
- Linux 依賴動態庫 / 靜態庫的動態態庫 / 靜態庫Linux
- Java呼叫C/C++編寫的第三方dll動態連結庫(非native API)--- JNIJavaC++API
- VS(visual studio) C++ 封裝dll,以及其隱式呼叫與顯式呼叫(靜態動態)C++封裝
- C/C++封裝庫ocicpplib呼叫Oracle儲存過程的方法C++封裝Oracle儲存過程
- C/C++ 編譯器和偵錯程式以及靜態庫、動態庫使用匯總(轉)C++編譯
- android使用C/C++呼叫SO庫AndroidC++