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"}
...全文
135 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
crick 2006-06-01
  • 打赏
  • 举报
回复
大家有谁用过啊
WecanHuang 2006-05-30
  • 打赏
  • 举报
回复
up

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧