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



我正在开发一个填充Oracle(11g)数据库的C++应用程序。此数据库具有具有以下签名的包:

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;

但是,我无法访问应用程序中的O_CFG引用光标。这就是我定义 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(); 

但是,我无法定义第 5 个参数数据类型。我已经尝试使用OCCICURSOR,OCCIREF和许多其他数据类型。

当执行指令executeQuery()时,会抛出一个带有ORA-6550的oracle::occi::SQLException。此 ORA 表示参数类型不匹配。

我以前用CLOB写作过,但从来没有通过REFCURSOR。

经过一些测试,解决方案是使用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);

相关内容

  • 没有找到相关文章