ストア プロシージャから 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 を呼び出す前に を割り当ててみましたが、あまり役に立ちませんでした。私は何を取りこぼしたか?