• 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的存储过程了,欧也





  • 相关阅读:
    Eclipse查看某个方法被哪些类调用
    ServletContextListener的作用
    ServletContextListener使用详解(监听Tomcat启动、关闭)
    通用测试用例大全
    Spring常用注解汇总
    Spring @Lazy
    Qt 事件处理 快捷键(重写eventFilter的函数,使用Qt::ControlModifier判断)
    Qt之使用setWindowFlags方法遇到的问题(追踪进入QWidget的源码分析原因,最后用WINAPI解决问题)good
    delphi idhttp 实战用法(TIdhttpEx)
    delphi 线程教学第一节:初识多线程(讲的比较浅显),还有三个例子
  • 原文地址:https://www.cnblogs.com/wgp13x/p/3854152.html
Copyright © 2020-2023  润新知