尝试从Oracle查询调用外部C函数时是否有人看到此错误?我每次尝试调用库中的两个函数之一时都使用Oracle 10g并收到此错误。对其他函数的调用每次都返回正常,但有效的函数都是自包含的,不调用任何OCI *函数。
以下是用于调用失败的C代码的存储过程:
CREATE OR REPLACE PROCEDURE index_procedure(text in clob, tokens in out nocopy clob, location_needed in boolean)
as language c
name "c_index_proc"
library lexer_lib
with context
parameters
(
context,
text,
tokens,
location_needed
);
任何帮助将不胜感激。我在此错误消息中找到的所有内容都表明要采取的措施是:联系Oracle客户支持。
编辑:我已经将它缩小到我知道在令牌clob上调用OCILobTrim(将其截断为0长度)后libclntsh中存在段错误的程度。这是我用来调用此过程的代码。
declare text CLOB; tokens CLOB;
begin
dbms_lob.createtemporary(tokens, TRUE);
dbms_lob.append(tokens, 'token');
dbms_lob.createtemporary(text, TRUE);
dbms_lob.append(text, '<BODY>Test Document</BODY>');
index_procedure(text, tokens, FALSE);
dbms_output.put_line(tokens);
end;
/
此设置是否有问题可能导致OCILobTrim问题?
答案 0 :(得分:1)
看起来这是其中一个错误,实质上意味着外部程序可能出现任何问题。
10.2.0.3中存在一个已知错误,不知道它是否相关:
尝试选择时发生ORA-28579 来自流水线表函数的数据 用“C”实现 ODCITable / ANYDATASET接口。 ODCITableDescribe工作正常但是 ODCITableFetch生成ORA-28579 错误。
我建议:
答案 1 :(得分:1)
嗯,升级到10.2.0.4(使用10.2.0.1)至少给了我一个可以理解的错误,而不是一个相当无用的核心文件和ORA-28579。
事实证明,我正在调试的代码假设调用OCILobRead会在一次传递中返回所有数据。对于使用固定宽度字符集的任何客户端都是这种情况。
对于使用可变宽度字符集的客户端,情况并非如此,OCILobRead实际上正在读取部分数据并返回OCI_NEED_DATA,并且未来对OCILobTrim和OCILobWrite的调用因为仍在等待调用OCILobRead而失败。解决方案是循环OCILobRead调用,直到不再返回OCI_NEED_DATA,并且我们在缓冲区中拥有所有需要的数据。
对OCIBreak的调用也会允许OCILobTrim和OCILobWrite函数继续运行,尽管我们不会拥有所有需要的输入数据。