从存储过程中我想输出 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 之前分配 ,但这并没有太大帮助。我错过了什么?