0

从存储过程中我想输出 a CLOB,因为 avarchar2不够长(即使我在这个例子中只使用 255 个字符)。

我找到了一些 oracle 示例并尝试将它们与我的代码一起使用。但遗憾的是,我的CLOB. 我怎样才能正确写入CLOB

下面是 C++ 代码的样子:

extern "C" DLLEXPORT 
void version(OCIExtProcContext* context, OCILobLocator **out, sb4 *ind_out){
    OCIEnv* envh;
    OCISvcCtx* svch;
    OCIError* errh;
    OCIExtProcGetEnv (context, &envh, &svch, &errh);

    std::string versioninfo;
    versioninfo = "103";

    oraub8 written = 10;

    OCIDescriptorAlloc(envh, 
                       (dvoid **) out,
                       (ub4) OCI_DTYPE_LOB,       /* Type of Descriptor */
                       (size_t) 0, 
                       (dvoid **) 0);
    OCILobTrim2(svch, 
               errh, 
               *out,
               (ub4)1);


    OCILobWrite2(/*svcctx*/svch, /*errh*/errh, /*ociloblocator*/*out,
                 /*byte_amtp*/NULL, /*char_amtp*/NULL, /*offset*/1,
                 /*bufp*/(void*)versioninfo.c_str(), /*buflen*/versioninfo.size(),
                 /*piece*/OCI_ONE_PIECE, /*context for callback*/NULL,
                 /*callback*/NULL, /*csid*/0, /*csfrm*/SQLCS_IMPLICIT);
    *ind_out = 0;
    return;
}

SP注册如下:

create or replace
procedure version(versioninfo OUT clob) as
    external name "version" library myLib language c with context 
    parameters (context, versioninfo, versioninfo INDICATOR SB4);

我这样称呼SP:

declare
  res clob;
  begin
  --dbms_lob.createtemporary(res,true);
  version(res);
  dbms_output.put_line(dbms_lob.substr(res, 255, 0));
end;

如您所见,我也尝试CLOB在调用 SP 之前分配 ,但这并没有太大帮助。我错过了什么?

4

1 回答 1

0

OCILobCreateTemporary在使用该 CLOB 之前通过使用解决它。

    OCIDescriptorAlloc(envh, 
                       (dvoid **) out,
                       (ub4) OCI_DTYPE_LOB,       /* Type of Descriptor */
                       (size_t) 0, 
                       (dvoid **) 0);
    OCILobCreateTemporary(svch, errh, *out, 0, SQLCS_IMPLICIT, OCI_TEMP_CLOB, OCI_ATTR_NOCACHE, OCI_DURATION_CALL);
    ub4 amt = static_cast<ub4>(result.size());
    OCILobTrim2(svch, 
                errh, 
                *out,
                (ub4)amt);

    oraub8 amtp = static_cast<oraub8>(result.size());
    OCILobWrite2(/*svcctx*/svch, /*errh*/errh, /*ociloblocator*/*out,
                 /*byte_amtp*/NULL, /*char_amtp*/&amtp, /*offset*/1,
                 /*bufp*/reinterpret_cast<dvoid*>(const_cast<char*>(result.c_str())), /*buflen*/amt,
                 /*piece*/OCI_ONE_PIECE, /*context for callback*/NULL,
                 /*callback*/NULL, /*csid*/0, /*csfrm*/SQLCS_IMPLICIT);
    *ind = 0;
于 2012-10-11T14:55:08.773 回答