0

ストア プロシージャから a を出力したいのはCLOB、 avarchar2が十分な長さではないためです (この例では 255 文字を使用したとしても)。

オラクルの例をいくつか見つけて、コードで使用しようとしました。しかし、悲しいことに、私の中にあるコンテンツはないよう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 に答える