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"}