共用方式為


使用 SELECT 語句查詢 Oracle 資料庫

您可以使用 SELECT 語句持續輪詢 Oracle 資料庫中的數據表和檢視,設定 Oracle Database 配接器以接收定期的數據變更訊息。 您可以將 SELECT 語句指定為輪詢語句,配接器會定期執行以輪詢 Oracle 資料庫。 或者,您也可以指定配接器在數據中有變更時執行的投票后 PL/SQL 程式代碼區塊。 此區塊通常用於更新目標中查詢記錄上的欄位,或將查詢的記錄移至另一個數據表或檢視表。

若要啟用此功能,您必須在 Oracle Database 配接器上指定特定系結屬性。 您也可以在連線 URI 中設定 PollingId 屬性,以修改 POLLINGSTMT 作業的目標命名空間。 如需詳細資訊,請參閱 支援在 Oracle 資料庫中接收輪詢型資料變更訊息 ,以及在 Oracle 資料庫配接器中接收輪詢型數據變更訊息。 如需輪詢作業之 SOAP 訊息結構的相關信息,請參閱 輪詢作業的訊息架構2

使用 Oracle 資料庫配接器綁定屬性設定輪詢操作

下表摘要說明您用來設定配接器以接收數據變更訊息的 Oracle 資料庫配接器系結屬性。 您必須在 BizTalk Server 管理控制台中設定接收埠時指定這些系結屬性。

綁定屬性 說明
InboundOperationType 指定您要執行輪詢或通知輸入作業。 預設為 輪詢
PolledDataAvailableStatement 指定配接器執行的 SQL 語句,以判斷是否有任何數據可供輪詢。 只有當記錄可用時,您為 PollingStatement 系結 屬性指定的 SELECT 語句才會執行。 默認值為 SELECT 1 FROM DUAL,這表示無論所輪詢的數據表是否有數據,配接器都必須繼續輪詢。
PollingInterval 指定 Oracle 資料庫配接器執行 PolledDataAvailableStatement 系結屬性所指定的語句的間隔,以秒為單位。 預設值為500秒。 輪詢間隔會決定連續輪詢之間的時間間隔。 如果語句在指定的間隔內執行,適配器會在間隔的剩餘時間內暫停。
PollingStatement 指定輪詢語句。 若要使用 SELECT 陳述式查詢評估,您必須為此綁定屬性指定一個 SELECT 陳述式。 預設值為 null。

您必須指定PollingStatement綁定屬性的值,才能啟用輪詢。 只有在有數據可供輪詢時,才會執行輪詢語句,這是 由 PolledDataAvailableStatement 系結 屬性所決定。
PollingAction 指定輪詢作業的動作。 您可以使用「取用配接器服務」附加元件為操作產生的元數據,判斷特定操作的輪詢動作。
PostPollStatement 指定在執行由 PollingStatement 系結屬性所指定的語句之後執行的語句區塊。
PollWhileDataFound 指定如果正在輪詢的數據表中有數據可用,Oracle Database 配接器是否忽略輪詢間隔,並持續執行輪詢語句。 如果數據表中沒有可用的數據,配接器會還原為在指定的輪詢間隔執行輪詢語句。 預設值為 false。

如需這些屬性的更完整描述,請參閱 閱讀 Oracle 資料庫配接器系結屬性。 如需有關如何使用 Oracle 資料庫配接器輪詢 Oracle 資料庫的完整描述,請繼續閱讀。

本主題如何展示輪詢的運作方式

在本主題中,若要示範 Oracle 資料庫配接器如何使用 SELECT 語句支援接收資料變更訊息、建立 BizTalk 專案併產生 POLLINGSTMT 作業的架構,方法是將 PollingStatement 系結屬性設定為下列內容:

SELECT * FROM ACCOUNTACTIVITY FOR UPDATE  

當您執行範例所提供的 SQL 腳本,以在資料庫中建立這些物件時,就會建立 ACCOUNTACTIVITY 數據表。

備註

本主題中的協調流程會輪詢 ACCOUNTACTIVITY 數據表,這是執行範例所提供的腳本所建立的基底資料庫數據表。 您必須執行本主題中所述的類似程式,才能輪詢任何其他數據表。

為了示範輪詢作業,我們會執行下列動作:

  • PolledDataAvailableStatement 系結 屬性指定 SELECT 語句,以判斷要輪詢的數據表 (ACCOUNTACTIVITY) 具有任何數據的位置。 在此範例中,您可以將這個系結屬性設定為:

    SELECT COUNT (*) FROM ACCOUNTACTIVITY  
    

    這可確保只有在 ACCOUNTACTIVITY 數據表有一些記錄時,配接器才會執行輪詢語句。

  • PollingStatement 系結 屬性指定先前所述的 SELECT 語句。 此語句會擷取 ACCOUNTACTIVITY 數據表中的所有數據列。

  • 執行 PL/SQL 區塊做為 PostPollStatement 系結 屬性的一部分。 此語句會將所有數據從 ACCOUNTACTIVITY 資料表移至資料庫中的另一個數據表。 一旦發生這種情況,下次執行針對 PollingStatement 指定的語句時,它就不會擷取任何數據。

  • 在將更多數據新增至 ACCOUNTACTIVITY 數據表之前,您不會收到任何輪詢訊息。 因此,您必須使用新的記錄重新填入 ACCOUNTACTIVITY 資料表。 您可以執行範例所提供的more_activity_data.sql腳本來執行此動作。 執行這個腳本後,下一次輪詢作業將擷取插入到資料表中的新記錄。

如何從 Oracle 接收數據變更訊息

搭配 BizTalk Server 使用 Oracle 資料庫配接器在 Oracle 資料庫上執行作業牽涉到建置組塊中所述的下列程式性工作 ,以使用 Oracle Database 開發 BizTalk 應用程式。 若要設定配接器以使用 SELECT 語句輪詢 Oracle 資料庫,這些工作如下:

  1. 建立 BizTalk 專案,並針對您要輪詢的數據表產生 POLLINGSTMT 作業的架構。

  2. 在 BizTalk 專案中建立訊息,以便從 Oracle 資料庫接收訊息。

  3. 建立協調流程以接收來自 Oracle 的訊息,並將其儲存至資料夾。

  4. 建置及部署 BizTalk 專案。

  5. 藉由建立實體傳送和接收埠來設定 BizTalk 應用程式。

    這很重要

    針對內部輪詢案例,您必須一律設定單向接收埠。 不支援輸入操作的雙向接收埠。

  6. 啟動 BizTalk 應用程式。

    本主題提供執行這些工作的指示。

產生架構

您必須產生 POLLINGSTMT 作業的架構。 使用取用配接器服務增益集產生架構時,請執行下列工作。

定義訊息和訊息類型

您稍早產生的架構描述協調流程中訊息所需的「類型」。 訊息通常是變數,其類型是由對應的架構所定義。 一旦架構產生後,您必須從 BizTalk 專案的 Orchestration 視圖中將其連結到訊息。

針對本主題,您必須建立一則訊息,以接收來自 Oracle 的訊息。

執行下列步驟來建立訊息,並將其連結至架構。

  1. 將協調流程新增至 BizTalk 專案。 從方案總管中,以滑鼠右鍵按兩下 BizTalk 專案名稱,指向 [ 新增],然後按兩下 [ 新增專案]。 輸入 BizTalk 協調流程的名稱,然後按兩下 [ 新增]。

  2. 如果 BizTalk 專案尚未開啟,請開啟協調流程檢視視窗。 按一下 檢視,指向 其他 Windows,然後按一下 協調流程檢視

  3. 協調流程檢視中,以滑鼠右鍵按兩下 [ 訊息],然後按兩下 [ 新增訊息]。

  4. 以滑鼠右鍵按下新建立的訊息,然後選取 [ 屬性視窗]。

  5. 屬性 窗格中,對 Message_1 執行下列動作:

    使用此 若要這樣做
    識別碼 輸入 Receive
    訊息類型 從下拉式清單中展開 [架構],然後選取 [TablePolling.OracleDBBinding],其中 TablePolling 是您 BizTalk 項目的名稱。 OracleDBBindingSchema 是針對 ACCOUNTACTIVITY 數據表上 POLLINGSTMT 作業所產生的響應架構。

    重要 因為輪詢是單向作業,所以配接器所產生的架構不包含響應節點,因此架構中只有一個根節點。 如果您針對訊息類型使用這類架構,則必須依所產生架構的檔名來識別架構。

    例如,如果您為雙向作業建立架構,則架構檔案中名稱為 OracleDBBindingSchema 的節點可能看起來像是 “Request” 和 “Response”。 如果您想在協調流程中建立與要求架構對應的訊息,可以在清單中尋找 OracleDBBindingSchema.Request 來識別架構。 不過,在輪詢作業的情況下,由於唯一的節點是「POLLINGSTMT」,因此不容易識別您想要對應的架構,因為只有單一節點的架構不會以<schemafilename>.<rootnodename>形式列出。 相反地,這類架構只會以檔名列出。 在這種情況下,識別架構的唯一方式是架構檔名,例如 OracleDBBindingSchema。

設定協調流程

您必須建立 BizTalk 協調流程,才能使用 BizTalk Server 從 Oracle 接收輪詢式數據變更訊息。 在此協調流程中,配接器會執行針對 PollingStatement 系結屬性指定的SECT語句來接收回應。 SELECT 語句的回應消息會儲存至 FILE 位置。 查詢 Oracle 資料庫的典型調度過程會包含:

  • 接收和傳送圖形以接收來自 Oracle 的訊息,並分別傳送至 FILE 埠。

  • 從 Oracle 資料庫接收訊息的單向接收埠。

    這很重要

    針對內部輪詢案例,您必須一律設定單向接收埠。 不支援輸入操作的雙向接收埠。

  • 從 Oracle 資料庫傳送輪詢回應的單向傳送埠。

    範例編排如下所示。

    輪詢查詢的協調流程 Oracle

新增訊息圖形

請確定您為每個訊息圖形指定下列屬性。 Shape 數據行中所列的名稱是訊息圖形的名稱,如剛才提及的協調流程所示。

形狀 圖形類型 性能
接收訊息 收到 - 將 名稱 設定為 ReceiveMessage

- 將 Activate 設定為 True
儲存訊息 發送 - 將 [名稱] 設定為 SaveMessage

新增埠

請確定您為每個邏輯埠指定下列屬性。 [埠] 資料行中所列的名稱是協調流程中顯示的埠名稱。

港口 性能
OracleReceivePort - 將 標識符 設定為 OracleReceivePort

- 將 類型 設定為 OracleReceivePortType

- 將 通訊模式 設定為 單向

- 將 通訊方向 設定為 接收
SaveMessagePort - 將 標識碼 設定為 SaveMessagePort

- 將 類型 設定為 SaveMessagePortType

- 將 通訊模式 設定為 單向

- 將 通訊方向 設定為 傳送

指定動作圖形的訊息並連線到埠

下表指定您應該設定的屬性及其值,以配置動作圖形的訊息並將其連結至埠。 Shape 數據行中所列的名稱是訊息圖形的名稱,如先前所述的協調流程所示。

形狀 性能
接收訊息 - 將 訊息 設定為 接收

- 將 作業 設定為 OracleReceivePort.Polling.Request
儲存訊息 - 將 訊息 設定為 接收

- 將 作業 設定為 SaveMessagePort.Polling.Request

指定這些屬性之後,訊息圖形和埠會連線,且您的協調流程已完成。

您現在必須建置 BizTalk 解決方案,並將其部署至 BizTalk Server。 如需詳細資訊,請參閱 建置和執行協調流程

設定 BizTalk 應用程式

部署 BizTalk 項目之後,您稍早建立的協調流程會列在 BizTalk Server 管理控制台的 [ 協調流程 ] 窗格底下。 您必須使用 BizTalk Server 管理主控台來設定應用程式。 如需逐步講解,請參閱 逐步解說:部署基本 BizTalk 應用程式

設定應用程式牽涉到:

  • 選取應用程式的主機。

  • 將您在協調流程中建立的埠對應至 BizTalk Server 管理控制台中的實體埠。 為了這次編排,您必須:

    • 請定義硬碟上的某個位置,以及一個對應的 FILE 埠,讓 BizTalk 協調流程可以將來自 Oracle 的訊息放置於其中。 這些訊息將會是對您為接收埠指定的輪詢語句的回應。

    • 定義實體 WCF-Custom 或 WCF-OracleDB 單向接收埠。 這個端口會定期輪詢 Oracle 資料庫。 如需如何建立接收埠的資訊,請參閱 手動設定實體埠系結至 Oracle 資料庫配接器。 請確定您為接收埠指定下列系結屬性。

      綁定屬性 價值觀
      InboundOperationType 將此設定為 輪詢
      PolledDataAvailableStatement 在此範例中,將此系結屬性設定為:

      SELECT COUNT (*) FROM ACCOUNTACTIVITY

      這可確保只有在 ACCOUNTACTIVITY 數據表有一些記錄時,配接器才會執行輪詢語句。
      PollingStatement 針對這個系結屬性,指定SELECT語句,以從 ACCOUNTACTIVITY 數據表擷取所有記錄。 在此範例中,將此系結屬性設定為:

      SELECT * FROM ACCOUNTACTIVITY FOR UPDATE
      PostPollStatement 指定輪詢後語句,將所有數據從 ACCOUNTACTIVITY 數據表移至另一個數據表。 在此範例中,將此系結屬性設定為:

      BEGIN ACCOUNT_PKG.PROCESS_ACTIVITY(); END;

      如需不同系結屬性的詳細資訊,請參閱 閱讀 Oracle 資料庫配接器系結屬性

      備註

      建議您在使用 Oracle 資料庫配接器執行輸入作業時,設定交易隔離等級和交易逾時。 您可以藉由在設定接收埠時新增服務行為來執行此動作。 如需如何新增服務行為的指示,請參閱 設定交易隔離等級和交易逾時

啟動應用程式

您必須啟動 BizTalk 應用程式以便輪詢 Oracle 資料庫。 如需啟動 BizTalk 應用程式的指示,請參閱 如何啟動協調流程

在這個階段,請確定:

  • 執行中的 WCF-Custom 或 WCF-OracleDB 單向接收埠會使用 PollingStatement 系結屬性中指定的 SELECT 語句來輪詢 Oracle。

  • 從 Oracle 資料庫接收訊息的 FILE 傳送埠正在執行中。

  • 作業的 BizTalk 協調流程正在執行中。

執行作業

執行應用程式之後,會以相同的順序執行下列一組動作:

  • 配接器會執行 PolledDataAvailableStatement ,其會傳回正值,指出配接器執行針對 PollingStatement 系結屬性指定的語句。

  • 配接器會執行 PollingStatement 系結 屬性的 SELECT 語句,並傳回 ACCOUNTACTIVITY 數據表中的所有數據列。 Oracle 資料庫的回應如下所示:

    <?xml version="1.0" encoding="utf-8" ?>   
    <POLLINGSTMT xmlns="http://Microsoft.LobServices.OracleDB/2007/03/POLLINGSTMT">  
      <POLLINGSTMTRECORD>  
        <POLLINGSTMTRECORD>  
          <TID>1</TID>   
          <ACCOUNT>100001</ACCOUNT>   
          <AMOUNT>500</AMOUNT>   
          <DESCRIPTION />   
          <TRANSDATE>2008-08-03T20:10:28</TRANSDATE>   
          <PROCESSED>n</PROCESSED>   
        <POLLINGSTMTRECORD>  
      <POLLINGSTMTRECORD>  
          ......  
          ......  
      </POLLINGSTMTRECORD>  
        ......  
        ......  
      </POLLINGSTMTRECORD>  
    </POLLINGSTMT>  
    
  • 配接器會執行輪詢後語句,該語句會將所有數據從 ACCOUNTACTIVITY 數據表移至另一個數據表。

  • 輪詢間隔之後,配接器會再次執行 PolledDataAvailableStatement。 因為 ACCOUNTACTIVITY 資料表目前沒有任何記錄,PolledDataAvailableStatement 不會返回有效值,因此配接器不會執行針對 PollingStatement 綁定屬性所指定的語句。 因此,配接器用戶端不會收到任何輪詢訊息。

  • 配接器用戶端將不會再收到任何輪詢訊息,直到明確地將某些記錄插入到 ACCOUNTACTIVITY 表為止。 若要插入更多記錄,您可以執行範例所提供的more_activity_data.sql腳本。 執行此腳本之後,下次執行 PolledDataAvailableStatement 時,它會傳回正值。 因此,配接器會執行輪詢語句,而配接器用戶端會再次接收輪詢訊息。

備註

Oracle Database 配接器將持續進行輪詢,直到您從 BizTalk Server 管理控制台中明確停用接收埠為止。

可能的例外狀況

如需使用 BizTalk Server 在 Oracle 資料庫上執行輪詢查詢時可能會遇到的例外狀況相關信息,請參閱 Oracle 資料庫配接器的例外狀況和錯誤處理

最佳做法

部署並設定 BizTalk 項目之後,您可以將組態設定匯出至稱為系結檔案的 XML 檔案。 產生系結檔案之後,您可以從檔案匯入組態設定,讓您不需要為相同的協調流程建立傳送埠和接收埠。 如需系結檔案的詳細資訊,請參閱 重複使用 Oracle 資料庫配接器系結

另請參閱

使用 BizTalk Server 輪詢 Oracle 資料庫