代码之家  ›  专栏  ›  技术社区  ›  Ryan Ahearn

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

  •  0
  • Ryan Ahearn  · 技术社区  · 16 年前

    当试图从Oracle查询调用外部C函数时,是否有人看到此错误?我使用的是Oracle10g,每次我试图调用库中的两个函数之一时都会得到这个错误。对另一个函数的调用每次都会返回良好的结果,尽管工作的函数都是独立的,但不调用任何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中有一个segfault。这是我用来调用此过程的代码。

    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 回复  |  直到 14 年前
        1
  •  1
  •   Dave Costa    16 年前

    看起来这是其中一个错误,本质上意味着任何数量的事情都可能在外部过程中出错。

    10.2.0.3中有一个已知的bug,不知道它是否相关:

    ORA-28579在尝试选择时发生 来自管道表函数的数据 在“c”中使用 odcitable/anydataset接口。 Odicitabledescribe作品不错,但是 ODCItableFetch生成ORA-28579 错误。

    我建议:

    1. 在数据库服务器中查找 跟踪目录和目录 外部过程所在的位置, 对于生成的任何日志或跟踪文件 当错误发生时。
    2. 插入外部进程 以某种方式让你可以尝试 自己追踪它的执行。
    3. 联系Oracle支持部门
        2
  •  1
  •   Ryan Ahearn    16 年前

    好吧,升级到10.2.0.4(使用10.2.0.1)至少给了我一个可以理解的错误,而不是一个相当无用的核心文件和ORA-28579。

    事实证明,我调试的代码假设调用ocilobread将在一次传递中返回所有数据。对于使用固定宽度字符集的任何客户机来说都是如此。

    对于使用可变宽度字符集的客户机,情况并非如此,Ocilobread实际上正在读取部分数据,并返回OCI需要的数据,未来对Ocilobtrim和Ocilobwrite的调用由于对Ocilobread的调用仍处于挂起状态而失败。解决方案是循环ocilobread调用,直到oci需要的数据不再返回,并且我们的缓冲区中有所有需要的数据。

    对ocibreak的调用也将允许ocilobtrim和ocilobwrite函数继续运行,尽管我们没有所有需要的输入数据。

    推荐文章