LIBRARY 對象指向文件路徑;listener.ora + tnsnames.ora 支援 extproc;#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) int square_of(int x) {
return x * x;
}
#ifdef __cplusplus
}
#endif
CREATE OR REPLACE LIBRARY mylib AS 'D:\installed\oracle\ora92\bin\test1.dll';
CREATE OR REPLACE FUNCTION mytest1 RETURN DOUBLE PRECISION AS
LANGUAGE C
NAME "fnTest1"
LIBRARY mylib
PARAMETERS (RETURN DOUBLE);
原因:extproc 監聽配置缺失或錯誤。
解決:
-- tnsnames.ora
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA = (SID = PLSExtProc)(PRESENTATION = RO))
)
-- listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = ora10g)
(ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
)
)
重啟監聽器:lsnrctl reload。
原因:C++ 編譯器對函數名進行 Name Mangling,導致符號不匹配。
解決:在 C++ 源碼中使用 extern "C" 包裹導出函數(見上方範例),確保導出符號為純函數名 square_of。
| 參數類型 | PARAMETERS 子句 | C 原型 |
|---|---|---|
| IN NUMBER | PARAMETERS (x INT) | int fn(int x) |
| OUT NUMBER | PARAMETERS (y INT, RETURN INT) | void fn(int *y) |
| IN OUT NUMBER | PARAMETERS (z INT, RETURN INT) | void fn(int *z) |
| STRING | PARAMETERS (str STRING, len INDICATOR) | void fn(char *str, short *len) |
extern "C" 導出;HS_FDS_TRACE_LEVEL = DEBUG、查看 $ORACLE_HOME/hs/log 日志。