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,
                                          const Ice::Current& current)
{
     CObjectQueryUtil db;    //定义连接类
     int dirId = 0; 
     int isHaveNode = 0;
     int isParentExit = 0;
     int flag = db.Init(m_strUser, m_strPwd, m_strDBSid);
     if (flag == -1)
     {
         this ->ConvertStringToBytes(strErrMsg, db.GetLastErrMsg());
         LOG_ERROR( "KeywordMgr:" + db.GetLastErrMsg());
         return flag;
     }
     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" );
     return dirId;
}
至此, 你就可以调用C++方法来使用 Oracle的存储过程了,欧也





转载于:https://www.cnblogs.com/wgp13x/p/3854152.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值