2014-02-20 1 views
1

Oracle (11g) 데이터베이스를 채우는 C++ 애플리케이션을 개발 중입니다. 이 데이터베이스는 다음과 같은 서명 패키지가 있습니다C++과 OCCI를 사용하여 CLOB로 작성하기

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(); 

그러나 다섯 번째 인수 데이터 형식을 정의 할 수 없습니다. OCCICURSOR, OCCIREF 및 기타 여러 데이터 유형을 사용하려고 이미 시도했습니다.

executeQuery() 명령을 수행하면 oracle :: occi :: SQLException이 ORA-6550으로 처리됩니다. 이 ORA는 인수 유형이 일치하지 않음을 나타냅니다.

이전에 CLFC에 글을 쓰면서 일했지만 REFCURSOR에서는 결코 사용하지 않았습니다.

답변

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);