OLEDB ATL模板类调用带返回值跟游标的oracle存储过程

OLEDB ATL模板类调用带返回值和游标的oracle存储过程
关于OLEDB ATL模板类调用带返回值和游标的oracle存储过程,哪位大神能给个完整的DEMO,谢谢
------解决思路----------------------
#include <sstream>
#include <ace/Auto_Ptr.h>
#include <DBOracle.h>
#include "AppDBAccess.h"

extern string g_db;
extern string g_host;
extern string g_user;
extern string g_passwd;
extern string g_connection_mode;
extern DBManager<DBOracle> *g_p_db_manager;
using namespace std;
using namespace oracle;

int DBAccessHelper::connectionKeepAlive() {
//  if (g_connection_mode=="short") {
        DBManager<DBOracle> m_db_manager(g_db, g_user, g_passwd, g_host, 1, 6);
        Connection_Guard<DBOracle> dd(&m_db_manager);
//  } else {//(g_connection_mode=="long")
//      Connection_Guard<DBOracle> dd(g_p_db_manager);
//  }
    oracle::Connection* p_conn = dd.getConnection();
    if ( !p_conn ) {
        return -1;
    }
    auto_ptr<oracle::Statement> pStmt;
    try {
        pStmt.reset(p_conn->createStatement("begin :cursor := sp_test( :n1, :s2 ); end;"));
        pStmt->setCursor(1);
        int n1=1;
        pStmt->setInt(2,&n1);
        pStmt->setString(3,"HaHa!",5+1);

//      pStmt.reset(p_conn->createStatement("select * from DUAL"));

        auto_ptr<oracle::Resultset> pRs;
        pRs.reset(pStmt->executeQuery());

        int recnum=0;
        while (1) {
            if ( pRs->next() ) {
                int rint;
                std::string rstr;
                recnum++;
                rstr = pRs->getString( "A" );
                rstr = pRs->getString( "B" );
                rstr = pRs->getString( "C" );
                rint = pRs->getInt( "C1" );
                rint = pRs->getInt( "C2" );

//              rstr = pRs->getString( 0 );
            } else {
                break;//
            }
        }
    } catch ( oracle::SQLException& ex ) {
        return -3;
    }
    return 0;
}
...
void Statement::setCursor( int intParamIndex )
{
    OCIBind* pbnd;
    if (OCIBindByPos ( _pstmth,
                &pbnd,
                _perrh,
                intParamIndex,
                &_cursor,
                0,
                SQLT_RSET,
                (ub2 *) 0,
                (ub2 *) 0,
                (ub4)   0,
                (ub4)   0,
                (ub4 *) 0,
                (ub4)   OCI_DEFAULT))
    {
        throw SQLException( _perrh );
    } else {
        cursorBinded=TRUE;
//      ACE_DEBUG( ( LM_DEBUG, "[%D %T] [DEBUG] (%N:%l)\tsetCursor\n" ) );
    }
}