使用C++;和欧西 我正在开发一个C++应用程序,它填充了一个Oracle(11G)数据库。此数据库有一个具有以下签名的包: 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;

使用C++;和欧西 我正在开发一个C++应用程序,它填充了一个Oracle(11G)数据库。此数据库有一个具有以下签名的包: 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;,c++,oracle,oracle11g,occi,C++,Oracle,Oracle11g,Occi,但是,我无法在应用程序中访问O_CFG refcursor。这就是我定义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))

但是,我无法在应用程序中访问O_CFG refcursor。这就是我定义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。这表明参数类型不匹配


我以前用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);
OraStmt->setSQL(“开始:1:=SCHM.PCK.SAVE_CONF(:2,:3,:4,:5,:6);结束;”;
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,字符串,32767);
OraStmt->setAutoCommit(FALSE);
OraStmt->executeUpdate();
结果集*rs;
rs=OraStmt->getCursor(5);
rs->next();
Clob Clob=rs->getClob(1);
char*pBuffer=static_cast(Configuration.GetBuffer(0));
int remaining=Configuration.GetLength();
int-writed=0;
int pos=0;
做
{
writed=cLob.writeChunk(剩余的(未签名的字符*)&pBuffer[pos],剩余的,1);
pos+=书面形式;
剩余-=书面;
}
而(剩余>0);
OraStmt->closeResultSet(rs);