最近在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感興趣的讀者可以通過本文最後的相關鏈接查找了解。
操作系統:Windows7
Oracle: 版本為oracle11g
Mysql:版本為mysql5.1
Jdk: jdk1.6.0_10
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數據庫存儲的程序單元的開發
使用AEAI DP開發平台,創建自帶WS服務的應用,如下圖:
選擇數據庫信息
部署應用後,查看剛剛創建的應用自帶的WS服務
以下為創建存儲過程的基本語法
CREATE OR REPLACE PROCEDURE存儲過程名 ( --定義參數 )
IS
定義變量
BEGIN
開始PL/SQL體
END
說明PL/SQL體結束
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;
在存儲過程中,使用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);
1) 選中存儲過程的名字,右鍵選擇測試,進入測試頁面
2) 添加響應的參數值,F9或者點擊按鈕開始執行,執行後可以得到看到返回值
3) 切換到DBMS輸出頁面,可以看到打印的內容
DECLARE
resmark varchar2(1000);
BEGIN
pro_test_ws(''小鄭',resmark);
DBMS_OUTPUT.PUT_LINE(resmark);
END;
1) 打開sql窗口,執行上面的sql語句
2) 查看輸出信息
1處為存儲過程打印的信息,2為調用時打印輸出的信息
本文介紹了在oracle存儲過程中,使用UTL_HTTP工具包,通過創建請求報文以及使用HTTP協議來調用Web Service,從創建oracle存儲過程以及UTL_HTTP相關參數的配置,到通過PL/SQL Developer測試調用以及sql代碼進行調用來詳細說明。
附件為存儲過程創建sql、調用sql以及接口程序和相關的數據庫文件。
AEAI DP開發平台/ AEAI ESB集成平台相關介質以及文檔資料地址:http://www.agileai.com/portal/website/01/res-share.ptml
文檔及代碼附件下載:http://pan.baidu.com/s/1kVyMVQn