oracle存储过程如下CREATE OR REPLACE PROCEDURE SERVER.QUERYBAL ( transtype IN VARCHAR2, u_id IN VARCHAR2, bankcode IN VARCHAR2, savingaccount IN VARCHAR2, paytranscode IN VARCHAR2, contractno IN VARCHAR2, amount OUT VARCHAR2, moneytype IN VARCHAR2, as400serial in VARCHAR2, pid IN VARCHAR2, payserial IN VARCHAR2, transtime IN VARCHAR2, stocktranspin IN VARCHAR2, cryptogram IN VARCHAR2, handleresult OUT VARCHAR2, oldbalance IN VARCHAR2, note OUT VARCHAR2) IS v_LocalNote VARCHAR2(147) := ''; BEGIN handleresult :='99'; amount := '0000000013000'; note := '0000000000000'; END QUERYBAL;入口参数: contractno 8位,用户号 date 6位, 查询月份(格式yyyymm) 其他参数为null出口参数: handleresult 2位 amount 13 位 note 共13 位void CGasServiceDlg::OnStartserviceButton() { // TODO: Add your control notification handler code here App->dboracle=new CDatabase; CString ConnectString; ConnectString.Format("DSN=%s;UID=%s;PWD=%s",App->AliasName_oracle,App->UserName_oracle,App->PassWord_oracle); int nRet; TRY { nRet=App->dboracle->OpenEx(ConnectString,CDatabase::noOdbcDialog); } CATCH (CDBException, e) { App->WriteLogFile("Oracle数据库连接失败"); AddToLogList("Oracle数据库连接失败"); delete App->dboracle; return; }END_CATCH
bool CStoreProcedureProcessor::DoBackupBillingCycle(long& iRet,std::string& szRet)
{
m_Database.GetParameters().Add("iret",0,OPARAMETER_OUTVAR,OTYPE_NUMBER);
m_Database.GetParameters().Add("errcode",0,OPARAMETER_OUTVAR,OTYPE_VARCHAR2);
if(OSUCCESS != m_Database.ExecuteSQL("Begin Dobackupbillingcycle(:iret,:errcode); end;"))
throw RuntimeError("错误:执行Dobackupbillingcycle存储过程错误!");
OValue value;
if(OSUCCESS != m_Database.GetParameters().GetParameter("iret").GetValue(&value))
throw RuntimeError("错误:无法取得 返回参数iret!");
iRet = (long)value;
if(OSUCCESS != m_Database.GetParameters().GetParameter("errcode").GetValue(&value))
throw RuntimeError("错误:无法取得 返回参数errcode!");
szRet = (LPCTSTR)value;
m_Database.GetParameters().GetParameter("iret").Close();
m_Database.GetParameters().GetParameter("errcode").Close();
m_Database.GetParameters().Remove("iret");
m_Database.GetParameters().Remove("errcode");
m_Database.GetParameters().Close();
return true;
}
大侠好像知道啊,麻烦赐教啊,:)
如:
//执行存储过程
m_pRs->Open("begin PCaseAnalysis('1','20041215'); end;",_variant_t((IDispatch*)m_pConn,true),
adOpenDynamic,adLockOptimistic,adCmdUnknown);
上面这段语句就是执行了名为PCaseAnalysis的存储过程,'1','20041215'则分别是传给这个存储过程的第一及第二个参数。
如果是一次性传入参数,可以把存储过程和参数组成一个SQL语句传入,如果是变参,则须引入Command 对象。
transtype IN VARCHAR2,
u_id IN VARCHAR2,
bankcode IN VARCHAR2,
savingaccount IN VARCHAR2,
paytranscode IN VARCHAR2,
contractno IN VARCHAR2,
amount OUT VARCHAR2,
moneytype IN VARCHAR2,
as400serial in VARCHAR2,
pid IN VARCHAR2,
payserial IN VARCHAR2,
transtime IN VARCHAR2,
stocktranspin IN VARCHAR2,
cryptogram IN VARCHAR2,
handleresult OUT VARCHAR2,
oldbalance IN VARCHAR2,
note OUT VARCHAR2) IS
v_LocalNote VARCHAR2(147) := '';
BEGIN
handleresult :='99';
amount := '0000000013000';
note := '0000000000000';
END QUERYBAL;入口参数:
contractno 8位,用户号
date 6位, 查询月份(格式yyyymm)
其他参数为null出口参数:
handleresult 2位
amount 13 位
note 共13 位void CGasServiceDlg::OnStartserviceButton()
{
// TODO: Add your control notification handler code here App->dboracle=new CDatabase; CString ConnectString;
ConnectString.Format("DSN=%s;UID=%s;PWD=%s",App->AliasName_oracle,App->UserName_oracle,App->PassWord_oracle); int nRet;
TRY
{
nRet=App->dboracle->OpenEx(ConnectString,CDatabase::noOdbcDialog);
}
CATCH (CDBException, e)
{
App->WriteLogFile("Oracle数据库连接失败");
AddToLogList("Oracle数据库连接失败");
delete App->dboracle;
return;
}END_CATCH
if(nRet==0)
{
App->WriteLogFile("Oracle数据库连接失败");
AddToLogList("Oracle数据库连接失败");
return;
}
else
{
App->WriteLogFile("Oracle数据库连接成功");
AddToLogList("Oracle数据库连接成功");
} if((m_SocketThread=AfxBeginThread(RUNTIME_CLASS(CSocketThread)))==NULL)
{
App->WriteLogFile("启动侦听服务线程失败");
AddToLogList("启动侦听服务线程失败");
}
else
{
m_StartService.EnableWindow(false);
m_StopService.EnableWindow(true);
App->WriteLogFile("启动侦听服务线程成功");
AddToLogList("启动侦听服务线程成功");
}
}void CTradeThread::Trade7301Proc()
{
CString SQL;
char Amount[14];
char HandleResult[3];
char Note[148]; memset(Amount,0x0,sizeof(Amount));
memset(HandleResult,0x0,sizeof(HandleResult));
memset(Note,0x0,sizeof(Note)); char date[7],contractno[9]; memset(date,0x0,sizeof(date));
memset(contractno,0x0,sizeof(contractno)); memcpy(date,RecvBuffer+24,6);
memcpy(contractno,RecvBuffer+16,8); SQL.Format("exec QUERYBAL NULL,'%s',NULL,NULL,NULL,'%s',Amount,NULL,NULL,NULL,NULL,NULL,NULL,NULL,HandleResult,NULL,Note",date,contractno);
App->dboracle->ExecuteSQL(SQL); //一执行就抛出异常}