1

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 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 がスローされます。この ORA は、引数の型の不一致を示唆しています。

以前に CLOB での書き込みを行ったことがありますが、REFCURSOR を使用したことはありません。

4

1 に答える 1

0

いくつかのテストの後、解決策は 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);
于 2014-03-31T14:10:15.520 に答える