oracle — пишите в CLOB, используя C ++ и OCCI

Я разрабатываю приложение на 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;

Однако я не могу получить доступ к рефрактору 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() выполняется oracle :: occi :: SQLException с ORA-6550. Это ORA предлагает несоответствие типа аргумента.

Я работал с написанием в CLOB раньше, но никогда через REFCURSOR.

1

Решение

После некоторого тестирования решение состояло в том, чтобы использовать 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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]