我有一个应该从 pl/sql 函数调用的 C 库,所以我创建了一个 .so 库,然后创建了一个 pl/sql 函数来调用它。
C源(libcprog.c)是这样的:
int exec_hmmftg ( char *p1 , char *p2, char *p3 ){}
oracle数据库中的库是:
CREATE LIBRARY CPROGLIB UNTRUSTED AS '/libcprog.so';
创建的 pl/sql 函数是:
CREATE OR REPLACE FUNCTION CALL_C_PROGRAM(P1 IN VARCHAR2,
P2 IN VARCHAR2,
P3 IN OUT VARCHAR2)
RETURN BINARY_INTEGER
IS EXTERNAL NAME "exec_hmmftg"
LIBRARY CPROGLIB
LANGUAGE C
PARAMETERS(P1 STRING, P2, P3 BY REFERENCE STRING, RETURN INT);
当我尝试调用CALL_C_PROGRAM时,我发现:
ORA-01405: fetched column value is NULL
我怎么知道问题出在哪里?
新的
我更改了库定义以解决某个错误,但我仍然遇到相同的异常!
在调用函数之前我必须设置一个参数或其他东西吗?
以下配置适用于我在 Oracle 11.2.0.2 上:
C编:
编译它,并确保它被放置在
$ORACLE_HOME/bin
or中$ORACLE_HOME/lib
(可以更改配置以允许其他目录) - AIX 的编译器标志也会有所不同。EXTPROC
在listener.ora
文件中配置:lsnrctl stop
使用后跟重新启动侦听器lsnrctl start
。创建对外部库的引用并创建函数以在 PL/SQL 和 C 程序之间进行接口:
测试功能:
在没有看到您编写的完整 C 的情况下不太确定您做错了什么。尝试设置我为您制作的这个简单案例,然后从那里一点一点地添加功能。
此错误是由未初始化的变量引起的。
例如,如果您像这样调用外部程序:
,你会得到错误。
在这种情况下,您不会:
我建议您为call_c_program实现一个包装器,它将初始化作为参数传递给 C 库的所有变量。