1. 概述 最近在ESB項目中,客戶在各個系統之間的服務調用大多都是在oracle存儲過程中進行的,本文就oracle存儲過程調用web service來進行說明。其他主流資料庫,比如mysql和sql service,調用web service的方法這裡就不做介紹了,本文主要用來介紹oracle存 ...
1. 概述
最近在ESB項目中,客戶在各個系統之間的服務調用大多都是在oracle存儲過程中進行的,本文就oracle存儲過程調用web service來進行說明。其他主流資料庫,比如mysql和sql service,調用web service的方法這裡就不做介紹了,本文主要用來介紹oracle存儲過程調用Web Service的方法。
眾所周知,在Web Service通過HTTP協議發送請求和接收結果時,發送的請求內容和結果內容都採用XML格式封裝,並增加了一些特定的HTTP消息頭,以說明HTTP消息的內容格式,這些特定的HTTP消息頭和XML內容格式就是SOAP協議。SOAP協議是基於HTTP協議的,兩者的關係就好比高速公路是基於普通公路改造的,在一條公路上加上隔離欄後就成了高速公路。
同理,在oracle的存儲過程中能不能也通過創建XML格式的報文+HTTP協議來調用Web Service呢?答案是肯定的,在ORACLE中有一個名叫UTL_HTTP的工具包,我們可以通過這個工具包來實現存儲過程調用Web Service。
上文提到的AEAI ESB是數通暢聯的核心產品之一,可以實現WEB服務開發和WEB服務註冊等功能,本文的介面樣例,本考慮使用ESB創建的WEB服務,但是由於涉及到的需要介紹的內容和本文主題太遠,所以採用了AEAI DP開發平臺自帶的Web服務樣例來說明。有對AEAI ESB感興趣的讀者可以通過本文最後的相關鏈接查找瞭解。
2. 預期讀者
- 數通暢聯新員工
- 廣大技術愛好者
3. 環境信息
操作系統:Windows7
Oracle: 版本為oracle11g
Mysql:版本為mysql5.1
Jdk: jdk1.6.0_10
4. 名詞解釋
AEAI ESB:應用集成平臺主要作為企業信息系統的“龍骨”來集成各業務系統,一般稱之為企業服務匯流排(Enterprise Service BUS,ESB),在數通暢聯軟體的產品家族中應用集成平臺命名為AEAI ESB。
AEAI DP:AEAI DP應用開發平臺專門用於開發MIS類的Java Web應用,也稱Miscdp(Misc Develope Platform)綜合應用開發平臺。 AEAI DP應用開發平臺在數通暢聯軟體產品家族中也作為擴展開發的支撐工具,比如:為AEAI Portal門戶平臺擴展開發Portlet組件、Web Service和Http Service;為AEAI BPM流程集成平臺擴展開發業務流程表單及功能等。
存儲過程:大型資料庫系統中,一組為了完成特定功能的SQL 語句集,存儲在資料庫中,經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。
UTL_HTTP:oracle中自帶的HTTP協議工具包,可以用來發送post請求。
PL/SQL Developer:一個集成開發環境,由Allround Automations公司開發,專門面向Oracle資料庫存儲的程式單元的開發
5. 操作步驟
5.1 創建樣例介面
使用AEAI DP開發平臺,創建自帶WS服務的應用,如下圖:
選擇資料庫信息
部署應用後,查看剛剛創建的應用自帶的WS服務
5.2 創建存儲過程
5.2.1 基本語法
以下為創建存儲過程的基本語法
CREATE OR REPLACE PROCEDURE存儲過程名 ( --定義參數 ) IS 定義變數 BEGIN 開始PL/SQL體 END 說明PL/SQL體結束 |
5.2.2 創建步驟
1、打開PL/SQL,並打開一個sql視窗
2、將創建存儲過程的語句放入其中並執行
這樣一個調用web service的存儲過程樣例就創建了,以下為詳細的樣例sql體
--創建存儲過程,定義四個參數,入參:userid,code,name;出參:resmark CREATE OR REPLACE PROCEDURE pro_test_ws(name in varchar2,resmark out varchar2) IS --定義四個變數,http請求,http返回,請求報文,返回報文 http_req UTL_HTTP.REQ; http_Resp UTL_HTTP.RESP; request_env VARCHAR2(32767); l_Replyline VARCHAR2(1000); BEGIN --開始pl/sql體 request_env := ' <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:demo="http://demo.service.wstest.agileai.com/"> <soapenv:Header/> <soapenv:Body> <demo:sayHi> <!--Optional:--> <theGirlName>'|| name ||'</theGirlName> </demo:sayHi> </soapenv:Body> </soapenv:Envelope> '; --列印請求報文 dbms_output.put_line(request_env); --請求WS地址 http_req := UTL_HTTP. begin_request('http://localhost:6060/cam/services/UserSync?wsdl', 'POST', UTL_HTTP.http_version_1_1); -- 保持連接狀態 Utl_Http.Set_Persistent_Conn_Support(http_req, TRUE); --設置編碼 Utl_Http.Set_Header(http_req, 'Content-Type', 'text/xml;charset=utf-8');
Utl_Http.Set_Header(http_req, 'SOAPAction', ''); --設置字元集 Utl_Http.Set_Body_Charset(http_req, 'utf-8'); --該參數代表我發送的POST報文多長,不可少 Utl_Http.Set_Header(http_req, 'Content-Length', Lengthb(request_env)); Utl_Http.Write_Line(http_req, request_env); --賦值http返回 http_Resp := Utl_Http.Get_Response(http_req); --將請求報文賦值給 l_Replyline Utl_Http.Read_Text(http_Resp, l_Replyline); dbms_output.put_line(l_Replyline); --付給存儲過程出參 resmark:=l_Replyline; END pro_test_ws; |
5.2.3 關鍵點說明
在存儲過程中,使用UTL_HTTP工具包調用web服務時,幾個關鍵方法的使用說明
1. 通過設置請求地址、方式、協議版本,得到http請求對象
http_req := UTL_HTTP. begin_request(' http://localhost:6060/wstest_project/services/HelloWorld?wsdl ', 'POST', UTL_HTTP.http_version_1_1); |
2. 設置協議保持連接狀態
Utl_Http.Set_Persistent_Conn_Support(http_req, TRUE); |
3. 設置請求編碼,SOAPAction header的值為空串("")表示SOAP消息的目的地由HTTP請求的URI標識;無值則表示沒有指定這條消息的目的地。
Utl_Http.Set_Header(http_req, 'Content-Type', 'text/xml;charset=utf-8'); Utl_Http.Set_Header(http_req, 'SOAPAction', ''); |
4. 設置字元集
Utl_Http.Set_Body_Charset(http_req, 'utf-8'); |
5. 報文長度
Utl_Http.Set_Header(http_req, 'Content-Length', Lengthb(request_env)); |
6. 調用服務,發送報文
Utl_Http.Write_Line(http_req, request_env); |
7. 得到返回體
http_Resp := Utl_Http.Get_Response(http_req); |
8. 將返回報文賦值給變數
Utl_Http.Read_Text(http_Resp, l_Replyline); |
5.3 調用存儲過程
5.3.1 使用PL/SQL Developer測試
1) 選中存儲過程的名字,右鍵選擇測試,進入測試頁面
2) 添加響應的參數值,F9或者點擊按鈕開始執行,執行後可以得到看到返回值
3) 切換到DBMS輸出頁面,可以看到列印的內容
5.3.2 使用sql代碼調用
DECLARE resmark varchar2(1000); BEGIN pro_test_ws(''小鄭',resmark); DBMS_OUTPUT.PUT_LINE(resmark); END; |
1) 打開sql視窗,執行上面的sql語句
2) 查看輸出信息
1處為存儲過程列印的信息,2為調用時列印輸出的信息
6. 總結說明
本文介紹了在oracle存儲過程中,使用UTL_HTTP工具包,通過創建請求報文以及使用HTTP協議來調用Web Service,從創建oracle存儲過程以及UTL_HTTP相關參數的配置,到通過PL/SQL Developer測試調用以及sql代碼進行調用來詳細說明。
附件為存儲過程創建sql、調用sql以及介面程式和相關的資料庫文件。
7. 相關鏈接
AEAI DP開發平臺/ AEAI ESB集成平臺相關介質以及文檔資料地址:http://www.agileai.com/portal/website/01/res-share.ptml
文檔及代碼附件下載:http://pan.baidu.com/s/1kVyMVQn