0

有人在尝试从 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 问题的问题?

4

2 回答 2

1

看起来这是那些错误之一,基本上意味着任何数量的事情都可能与外部程序出错。

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

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

我会建议:

  1. 在数据库服务器跟踪目录和外部 proc 所在的目录中查找发生错误时生成的任何日志或跟踪文件。
  2. 以某种方式检测您的外部过程,以便您可以尝试自己跟踪其执行。
  3. 联系 Oracle 支持
于 2009-01-09T21:33:02.833 回答
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 函数继续,尽管我们不会拥有所有需要的输入数据。

于 2009-01-15T19:54:49.063 回答