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的存儲過程了,歐也






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM