简体   繁体   English

使用C ++和OCCI在CLOB中编写

[英]Write in CLOB using C++ and OCCI

I'm developing a C++ application that populates an Oracle (11g) database. 我正在开发填充Oracle(11g)数据库的C ++应用程序。 This database has a package with the following signature: 该数据库具有一个带有以下签名的包:

FUNCTION SAVE_CONF
(I_USER IN VARCHAR2
,I_APP IN VARCHAR2
,I_CONTEXT IN VARCHAR2
,O_CFG OUT SYS_REFCURSOR  --CLOB
,O_ERROR_MSG OUT VARCHAR2
)
RETURN NUMBER;

However, i cannot access the O_CFG refcursor in my application. 但是,我无法在应用程序中访问O_CFG refcursor。 This is how I define my SQL statement. 这就是我定义SQL语句的方式。

OraStmt->setSQL("BEGIN :1 := SCHM.PCK.SAVE_CONF(:2,:3,:4,:5,:6); END;");
OraStmt->registerOutParam(1, OCCIINT);
OraStmt->setString(2, User.GetBuffer(0));
OraStmt->setString(3, App.GetBuffer(0));
OraStmt->setString(4, Context.GetBuffer(0));         
OraStmt->registerOutParam(5,OCCICLOB);
OraStmt->registerOutParam(6,OCCISTRING,32767);
OraStmt->setAutoCommit(FALSE);

OraStmt->executeQuery(); 

However, I'm not able to define the 5th argument data type. 但是,我无法定义第5个参数数据类型。 I've already tried to use a OCCICURSOR, a OCCIREF, and many other data types. 我已经尝试使用OCCICURSOR,OCCIREF和许多其他数据类型。

When the instruction executeQuery() is performed, an oracle::occi::SQLException is thrown with an ORA-6550. 当执行executeExecute executeQuery()指令时,将使用ORA-6550抛出oracle :: occi :: SQLException。 This ORA suggests an argument type mismatch. 该ORA建议参数类型不匹配。

I have worked with writing in CLOBs before but never through a REFCURSOR. 我之前曾从事过CLOB的编写工作,但从未通过REFCURSOR进行过编写。

After some testing, the solution was to use a ResultSet as intermediate. 经过一些测试后,解决方案是使用ResultSet作为中间对象。

OraStmt->setSQL("BEGIN :1 := SCHM.PCK.SAVE_CONF(:2,:3,:4,:5,:6); END;");
OraStmt->registerOutParam(1, OCCIINT);
OraStmt->setString(2, User.GetBuffer(0));
OraStmt->setString(3, App.GetBuffer(0));
OraStmt->setString(4, Context.GetBuffer(0));         
OraStmt->registerOutParam(5,OCCICLOB);
OraStmt->registerOutParam(6,OCCISTRING,32767);
OraStmt->setAutoCommit(FALSE);
OraStmt->executeUpdate(); 
ResultSet   *rs;

rs = OraStmt->getCursor(5);

rs->next();
Clob cLob = rs->getClob(1);

char *pBuffer = static_cast<char *>(Configuration.GetBuffer(0));

int remaining = Configuration.GetLength();
int written = 0;
int pos = 0;

do
{
    written = cLob.writeChunk(remaining, (unsigned char *)&pBuffer[pos], remaining, 1);

    pos += written;
    remaining -= written;
}
while(remaining > 0);

OraStmt->closeResultSet(rs);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM