ORACLE存儲過程調用Web Service

来源:http://www.cnblogs.com/agileai/archive/2016/11/04/6030612.html
-Advertisement-
Play Games

1. 概述 最近在ESB項目中,客戶在各個系統之間的服務調用大多都是在oracle存儲過程中進行的,本文就oracle存儲過程調用web service來進行說明。其他主流資料庫,比如mysql和sql service,調用web service的方法這裡就不做介紹了,本文主要用來介紹oracle存 ...


1. 概述

  最近在ESB項目中,客戶在各個系統之間的服務調用大多都是在oracle存儲過程中進行的,本文就oracle存儲過程調用web service來進行說明。其他主流資料庫,比如mysqlsql 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 BUSESB),在數通暢聯軟體的產品家族中應用集成平臺命名為AEAI ESB

AEAI DPAEAI DP應用開發平臺專門用於開發MIS類的Java Web應用,也稱MiscdpMisc Develope Platform)綜合應用開發平臺。 AEAI DP應用開發平臺在數通暢聯軟體產品家族中也作為擴展開發的支撐工具,比如:為AEAI Portal門戶平臺擴展開發Portlet組件、Web ServiceHttp Service;為AEAI BPM流程集成平臺擴展開發業務流程表單及功能等。

存儲過程:大型資料庫系統中,一組為了完成特定功能的SQL 語句集,存儲在資料庫中,經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。

UTL_HTTPoracle中自帶的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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄 1 易建聯脫鞋事件2 傳說中的網路水軍 2.1 網路水軍是什麼? 2.2 網路水軍發現技術3 基於同貼率的網路水軍發現4 基於情感分析的網路水軍發現5 總結 1 易建聯脫鞋事件 (圖片來自網路,侵刪) 2016年11月2日,剛剛從NBA回歸的易建聯沒想到搞了個大新聞!過去4年來,李寧公司作為C ...
  • 介紹 基於給定的分區個數,將數據分配到不同的分區,HASH分區只能針對整數進行HASH,對於非整形的欄位只能通過表達式將其轉換成整數。表達式可以是mysql中任意有效的函數或者表達式,對於非整形的HASH往表插入數據的過程中會多一步表達式的計算操作,所以不建議使用複雜的表達式這樣會影響性能。 MYS ...
  • My Sql 大部分都是用綠色版(解壓版) 然後註冊服務 簡單方便。 但是。配置文件頭痛的一逼。 首先配置mysql的環境變數。 mySQL 環境變數(我的電腦-右擊屬性-高級-環境變數) MYSQL_HOME(解壓路徑):E:\MYSQL\mysql-5.6.23-winx64 path:在最後面 ...
  • MySql select tablename.* from tablename limit firstIndex,pageSize; firstIndex >開始索引 pageSize >頁大小 Oracle Oracle select * from ( select a.*,ROWNUM rn f ...
  • sql server 2012深入解析與性能優化(第3版) 第五章 查詢處理和執行 1.sqlserver通過四個步驟處理一個查詢,分析,algebrizing,優化,執行。2.分析是分析語法錯誤生成分析樹,綁定部分有,名字解析,類型推倒,聚合綁定,組合綁定。查詢優化器,將查詢樹找到好的執行計劃,如 ...
  • 最近學習了一下SQL的分頁查詢,總結了以下幾種方法。 首先建立了一個表,隨意插入的一些測試數據,表結構和數據如下圖: 現在假設我們要做的是每頁5條數據,而現在我們要取第三頁的數據。(數據太少,就每頁5條了) 方法一: 結果: 此方法是先取出前10條的SID(前兩頁),排除前10條數據的SID,然後在 ...
  • 介紹 LIST分區和RANGE分區非常的相似,主要區別在於LIST是枚舉值列表的集合,RANGE是連續的區間值的集合。二者在語法方面非常的相似。同樣建議LIST分區列是非null列,否則插入null值如果枚舉列表裡面不存在null值會插入失敗,這點和其它的分區不一樣,RANGE分區會將其作為最小分區 ...
  • 標簽: MongoDB NoSQL MongoDB 存儲引擎和數據模型設計 1. 存儲引擎 1.1 存儲引擎是什麼 1.2 MongoDB中的預設存儲引擎 2. 數據模型設計 2.1 內嵌和引用 2.2 設計原則 A. 1 1 或者 1 (較少) B. 1 (較多) C. 1 (非常多) D. E. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...