VC++调用Oracle存储过程,查询返回游标类型的问题
crick 2006-05-30 04:31:13
1.VC++ 调用代码:
int CSmsDB::QueryReceive(_RecordsetPtr &pRecordset)
{
_CommandPtr m_pCommand;
_variant_t v_szErrMsg;
_ParameterPtr pErrMsg;
_variant_t vNull;
_variant_t vTmp;
_ParameterPtr pTmp;
try
{
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection=m_pDbConn;
m_pCommand->CommandText=_bstr_t("PKG_SMS_ADMIN.queryReceive");
m_pCommand->CommandType=adCmdStoredProc;
//nRet -- 存储过程返回值
pTmp.CreateInstance(__uuidof(Parameter));
pTmp=m_pCommand->CreateParameter( _bstr_t("@return_value"),adInteger,
adParamReturnValue,-1);
m_pCommand->Parameters->Append(pTmp);
...
//cur -- 需要返回的游标-数据集
pTmp.CreateInstance(__uuidof(Parameter));
pTmp=m_pCommand->CreateParameter( _bstr_t("cur"),adInteger, //问题1:adInteger 是否正确? 改用什么类型?
adParamOutput,-1);
m_pCommand->Parameters->Append(pTmp);
vNull.vt=VT_ERROR;
vNull.scode=DISP_E_PARAMNOTFOUND;
//------------ 执行存储过程,并取查询的结果集 -----------------//
pRecordset = m_pCommand->Execute(&vNull,&vNull,adCmdStoredProc); //问题2: 执行错误,错误信息:调用 'QUERYRECEIVE' 时参数个数或类型错误
//--------------------------------------------------------------//
//取存储过程-返回值
_variant_t v_nRet;
v_nRet=m_pCommand->Parameters->GetItem("@return_value")->GetValue();
...
}
catch(_com_error &e)
{
...
return -1;
}
return 0;
}
//---------------------------------------------------------------------------
2.Oracle9i存储过程说明:
--PKG_SMS_ADMIN包头,定义游标类型
create or replace package PKG_SMS_ADMIN is
TYPE refcur IS REF CURSOR;
...
--PKG_SMS_ADMIN包体,存储过程名称queryReceive(),其中有一个返回参数,cur(游标类型)
create or replace package body PKG_SMS_ADMIN is
function queryReceive(nFunctionId in smallint,
nReId in Tsms_Receive.Re_Id%type,
...
dReTimeStart in Tsms_Receive.Re_Receivetime%type,
dReTimeEnd in Tsms_Receive.Re_Receivetime%type,
nCurPage in int,
nPageSize in int,
nTotalCount out int,
szErrMsg out VARCHAR2,
cur out PKG_SMS_ADMIN.refcur)
return binary_integer is
m_nProdedureId int; --存储过程编号
m_szOption varchar2(500);
m_szSql varchar2(2000);
begin
...
--返回的游标
open cur for
m_szSql;
m_szSql := 'select count(*) from TSMS_RECEIVE where 1=1 ' || m_szOption;
execute immediate m_szSql into nTotalCount;
return 100;
exception
when others then
szErrMsg := sqlerrm;
return(m_nProdedureId-9999);
end queryReceive;
end;
3.详细错误信息:
{"ORA-06550: 第 1 行, 第 13 列:
PLS-00306: 调用 'QUERYRECEIVE' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored"}