程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> ORACLE存儲過程調用Web Service,oracle存儲過程

ORACLE存儲過程調用Web Service,oracle存儲過程

編輯:MySQL綜合教程

ORACLE存儲過程調用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 DPAEAI 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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved