C++调用存储过程-创新互联

Long long ago,项目里用的数据库是Oracle,服务用的是ICE,俺也是写过存储过程、发布过ICE服务的猿

在江北等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、网站制作 网站设计制作按需规划网站,公司网站建设,企业网站建设,品牌网站建设,全网营销推广,外贸营销网站建设,江北网站建设费用合理。存储过程提供给服务层调用,服务层简单明了,不足之处是,业务逻辑也包含在存储过程的代码里了,需求变更之时即是存储过程更改之日,而且Oracle的存储过程和MySQL的存储过程有些差别,逻辑代码不具备通用性。现在项目已经不再使用存储过程了,这里也把之前的经验总结一下,留作存档。如有引用,请注意说明来自:http://www.cnblogs.com/wgp13x/p/3854152.html 关键词:存储过程, Oracle, PLSQL Developer, C++, ICE摘要:在数据库中创建存储过程,提供给服务层调用,服务层简洁明了。如何在Oracle中一步步创建存储过程,如何实现存储过程,如何在C++中调用存储过程,如文中总结。
  步骤一、使用PLSQL连接Oracle如下图所示,使用PLSQL,输入用户名、密码、Schema连接Oracle成功后打开主界面,在Tables中可以查看所有的数据表,在Packages中查看所有的存储过程申明组成的包,在Package bodies中查看所有的存储过程正文组成的包。当然你可以右键new一个出来。以下是一个简单示例,主要实现对目录的各类操作:增、删、改等功能,C++调用Oracle存储过程,发布成服务。这一小示例,也是很有普遍意义的。现在在这一步,我们主要看一下包PKG_KEYWORD_MANAGE的实现过程。  步骤二、编写存储过程申明在包申明PKG_KEYWORD_MANAGE中申明以下三个存储过程:新增目录、更改目录、删除目录,在这里定义好它们的输入输出参数。如下图所示。   步骤三、编写存储过程正文在包PKG_KEYWORD_MANAGE中具体实现上面步骤申明的存储过程。下面是新增目录的具体实现,它里面包含有很多逻辑判断。   步骤四、C++编写调用存储过程首先连接到数据库,然后对SQL语句 begin PKG_KEYWORD_MANAGE.p_dir_add(:v1, :v2, :v3, :v4, :v5, :v6, :v7); end; 设置参数并执行,最终能得到结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 ::Ice::Int KeywordMgr::KeywordMgrInterfaceI::AddDir(::Ice::Int userId, ::Ice::Int parentDirId, const::KeywordMgr::DirInfoStruct& dirInfo, ::KeywordMgr::ByteSequence& strErrMsg, constIce::Current& current) { CObjectQueryUtil db;//定义连接类 intdirId = 0; intisHaveNode = 0; intisParentExit = 0; intflag = db.Init(m_strUser, m_strPwd, m_strDBSid); if(flag == -1) { this->ConvertStringToBytes(strErrMsg, db.GetLastErrMsg()); LOG_ERROR("KeywordMgr:"+ db.GetLastErrMsg()); returnflag; } Statement * p_stmt = db.GetStatement(); try { if(p_stmt) { p_stmt->setSQL("begin PKG_KEYWORD_MANAGE.p_dir_add(:v1, :v2, :v3, :v4, :v5, :v6, :v7); end;"); p_stmt->setString(1, CCommonUtil::ConvertBytesToString(dirInfo.Name)); p_stmt->setInt(2, parentDirId); p_stmt->setInt(3, userId); p_stmt->setString(4, CCommonUtil::ConvertBytesToString(dirInfo.Remark)); p_stmt->registerOutParam(5, OCCIINT); p_stmt->registerOutParam(6, OCCIINT); p_stmt->registerOutParam(7, OCCIINT); p_stmt->execute(); dirId = p_stmt->getInt(5); isHaveNode = p_stmt->getInt(6); isParentExit = p_stmt->getInt(7); } } catch(SQLException & ex) { LOG_ERROR(Poco::format("Insert new dir info fail: %s", ex.getMessage())); CCommonUtil::ConvertStringToBytes(strErrMsg, Poco::format("Insert new dir info fail: %s", ex.getMessage())); db.CloseConnection(); return-1; } db.CloseConnection(); if(!isParentExit) return-3; if(isHaveNode) return-2; LOG_INFO("Add new dir successfully"); returndirId; }
至此,你就可以调用C++方法来使用Oracle的存储过程了,欧也

来自王安琪(http://www.cnblogs.com/wgp13x/p/3854152.html)

作者:Angel 出处:http://www.cnblogs.com/wgp13x/ 欢迎转载或分享,但请务必声明文章出处。如果文章对您有帮助,希望你能推荐或关注。

王安琪,英文名Angel,南京邮电大学计算机应用技术硕士学位。 熟悉Java、C#编程语言。专注于WebService、海量数据处理、搜索引擎技术、消息中间件技术、分布式文件存储、.NET应用程序开发、系统架构设计。主要从事大数据管理系统的研发,项目经理,系统架构师,就职于江苏金陵科技集团有限公司。

Email:aitanjupt@hotmail.com

QQ:289770363


分享名称:C++调用存储过程-创新互联
地址分享:http://scjbc.cn/article/dhciss.html

其他资讯