当选择超过1行时,为什么ORA-03106在OCI程序中?仅10g,不是11g

问题描述 投票:3回答:1

我的OCI应用程序在执行SELECT * FROM mytable时返回ORA-03106(“致命的双任务通信协议错误”),其中mytable有四列:INTEGERVARCHAR(1000)FLOATDATE,以及两行。如果只有一行,则调用成功。如果表中有BLOB列(也正在被选中),则调用也会成功。

各种论坛都表明NLS_LANG相关问题可能是原因 - 即,在检索数据时,客户端上的字符集转换失败,因为(可能)无法找到字符集转换文件。请注意,我已经测试了许多可能的设置NLS_LANGNLS_CHARACTERSETORA_NLS10和其他环境变量的组合。设置某些这些会影响观察到的行为:有时候,Oracle会抛出ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist;在其他时候,客户端应用程序在检索到第一行之前崩溃(崩溃发生在OCIStmtFetch2()内)。值得注意的是,如果客户端应用程序在首次建立连接时执行以下查询:ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,',则不会发生崩溃;相反,返回ORA-03106: fatal two-task communication protocol error错误。

注意:有可能DATE列的存在导致了这一点 - 但是建立可重现的案例已经证明是非常困难的,因此我按原样发布我的问题。

我花了超过50个小时试图解决这个问题。任何帮助将不胜感激。

新:重要的附加细节(请参阅下面的代码片段):问题仅发生在PIECEWISE数据检索期间 - 我使用的两种方法中的哪一种(动态回调函数或使用get / set piece info的循环方法)无关紧要功能)。单步调试器并查看我提供给OCI的存储器中存储FETCHED数据的缓冲区,第一行中的所有4个字段总是被正确检索;第二列的初始FETCH(这是使用循环方法时返回的有关VARCHAR列信息请求的调用)成功填充所有非动态字段,但不包括VARCHAR列(即INTEGER)列已正确填充);然后下一个FETCH成功填充VARCHAR字段,并且应该成功填充剩余的(非动态)列(FLOAT和DATE字段);但是,FLOAT字段已正确填充,但DATE字段已损坏,此外,此FETCH调用应返回成功,但它返回ORA-03106。

以下代码片段,删除了无关的错误检查和其他代码,显示了正在发生的事情:

void RetrieveRow(...)
{
    // All necessary environment, statement, describe, and define functions
    // have already been called; non-dynamic buffers have already been allocated
    retcode = OCIStmtFetch2(mystmt, fConnection->myerrhp, 1, OCI_DEFAULT, 0, OCI_DEFAULT);
    while (retcode == OCI_NEED_DATA)
    {
        // ...
        // ... Define the necessary arguments to OCIStmtGetPieceInfo() here ...
        // ...
        OCIStmtGetPieceInfo(mystmt, fConnection->myerrhp, (dvoid**)&define, &type, &inout, &iter, &idx, &piecep)

        // ...
        // ... Iteratively allocate and increase the buffer size for the required dynamic column here...
        // ...
        OCIStmtSetPieceInfo(define, OCI_HTYPE_DEFINE, fConnection->myerrhp, buf, alenp, piecep, indp, rcodep)

        // ... Call OCIStmtFetch2() as part of the dynamic loop to fetch the next piece
        retcode = OCIStmtFetch2(mystmt, fConnection->myerrhp, 1, OCI_DEFAULT, 0, OCI_DEFAULT);
    }
    // retcode is OCI_SUCCESS here when RetrieveRow() is called for the first row,
    // ... and all data in the first row is properly populated in the buffers.
    // But, when RetrieveRow() is called the second time, the above loop is entered,
    // ... the INTEGER, VARCHAR (a dynamic field), and FLOAT fields are correctly populated,
    // ... but the DATE field is corrupt, retcode is OCI_ERROR, and the error is ORA-03106.
    // ... Note that even with a dynamic callback used instead of a loop, the error is the same.
    // ... Note that when piecewise (dynamic) fetching is NOT used,
    // ... all rows are retrieved successfully and there is no error.
}

注意:正如我的标题更改所反映的那样,使用OCI和Oracle 11g时不会出现此问题。使用代码COMPLETELY不变,但包括OCI 11g头文件并加载11g OCI dll,运行11g Oracle数据库服务器侦听器/实例,代码成功,没有此错误。只有10g发生错误。

如果可以提供明确且有信誉地将其标识为版本10g中的OCI / Oracle错误的引用,我将感到满意。 (我确信它是。)但是,我找不到任何确认这是OCI / Oracle错误。

oracle oracle10g oci
1个回答
0
投票

Oracle客户端和服务器的确切版本正在使用中?

至少有一个已知的Oracle错误可能匹配:

适用于:Oracle Server - Enterprise Edition - 版本:10.2.0.1至10.2.0.2 - 版本:10.2至10.2本文档中的信息适用于任何平台。已于2010年1月21日检查相关性

症状基于OCI的应用程序间歇性地抛出ORA-03106:致命的双任务通信原型错误,并在应用程序日志中有错误条目。

重要说明:alert.log和SQL NET跟踪文件中可能未显示该错误

原因这已被确定为错误4523125

解决方案将客户端和服务器升级到10.2.0.3

更一般地说,这似乎是Oracle支持的一个问题。

© www.soinside.com 2019 - 2024. All rights reserved.