ORACLE存儲過程調用Web Service

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感興趣的讀者能夠經過本文最後的相關連接查找了解。mysql

2預期讀者

數通暢聯新員工
廣大技術愛好web

3環境信息

操做系統:Windows7
Oracle: 版本爲oracle11g
Mysql:版本爲mysql5.1
Jdk:  jdk1.6.0_10sql

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服務的應用,以下圖:oracle


選擇數據庫信息工具


部署應用後,查看剛剛建立的應用自帶的WS服務 post


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);spa

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

相關文章
相關標籤/搜索