我有一些大型数据对象已使用 Boost 序列化为字符串/ostringstream。我想通过一个过程将这些序列化对象存储在数据类型为 CLOB 的数据库中。为此,我正在创建一个 CLOB 对象,但我不知道如何“将我的数据放入 CLOB(myClob)”。
我见过一些例子,但它们都使用字符指针,我宁愿不走那条小巷......
到目前为止,以下是我的 C++ 代码。如果您有任何示例或好的提示/链接,我将非常感谢您的帮助。
提前谢谢
string qOracleDb::testRunStoredProc(const string& xId, const qTime date, const string& xUsage, int type, const std::ostringstream& data)
{
try
{
Clob myClob;
myClob.setEmpty();
myClob ?????
myStmt=myConn->createStatement("BEGIN DATA.SAVE_DATA_TEMP( :1, :2, :3, :4, :5); END;");
Date asofDate(myEnv, date.year(), date.month(), date.day(),0,0,0);
myStmt->setDate(1, asofDate);
myStmt->setString(2,xId);
myStmt->setString(3,xUsage);
myStmt->setInt(4, type);
myStmt->setClob(5, myClob);
myStmt->execute();
}
catch(SQLException ex)
{
// close nicely
myConn->terminateStatement (myStmt);
return "Exception thrown : "+ ex.getMessage()+", " + qStringUtils::toString(ex.getErrorCode());
}
// close nicely
myConn->terminateStatement (myStmt);
return "succes";
}
更新:由于我找到了解决我的问题的代码示例,我想分享解决方案,因为其他人可能有一天也会面临这个“挑战”。我的数据变量已从流变为字符串,我的代码如下:
/* Create dummy-clob in DB and insert data */
myStmt = myConn->createStatement("begin dbms_lob.createtemporary(:p1,FALSE);end;");
myStmt->registerOutParam(1,OCCICLOB);
myStmt->executeUpdate();
Clob resClob = myStmt->getClob(1);
resClob.write((unsigned int)data.size(), (unsigned char*)data.c_str(),(unsigned int)data.size());
myConn->terminateStatement (myStmt);
myStmt=myConn->createStatement("BEGIN DATA.SAVE_NOUVO_DATA( :1, :2, :3, :4, :5); END;");
Date asofDate(myEnv, date.year(), date.month(), date.day(),0,0,0);
myStmt->setDate(1, asofDate);
myStmt->setString(2,xId);
myStmt->setString(3,xUsage);
myStmt->setInt(4, type);
myStmt->setClob(5, resClob);
myStmt->execute();