ORA-28579:从外部过程代理回调期间出现网络错误

时间:2009-01-09 21:17:57

标签: oracle oracle10g external-process

尝试从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问题?

2 个答案:

答案 0 :(得分:1)

看起来这是其中一个错误,实质上意味着外部程序可能出现任何问题。

10.2.0.3中存在一个已知错误,不知道它是否相关:

  

尝试选择时发生ORA-28579   来自流水线表函数的数据   用“C”实现   ODCITable / ANYDATASET接口。   ODCITableDescribe工作正常但是   ODCITableFetch生成ORA-28579   错误。

我建议:

  1. 查看数据库服务器 跟踪目录和目录 外部过程所在的位置, 对于生成的任何日志或跟踪文件 发生错误时。
  2. 检测您的外部过程     某种方式让你可以尝试     自己跟踪它的执行情况。
  3. 联系Oracle支持小组

答案 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函数继续运行,尽管我们不会拥有所有需要的输入数据。