使用 SELECT 語句輪詢 Oracle 資料庫
您可以使用 SELECT 語句持續輪詢 Oracle 資料庫中的資料表和檢視,設定 Oracle 資料庫配接器來接收週期性資料變更訊息。 您可以將 SELECT 語句指定為配接器定期執行的輪詢語句,以輪詢 Oracle 資料庫。 您也可以選擇性地指定配接器在資料發生變更時執行的輪詢後 PL/SQL 程式碼區塊。 此區塊通常用於更新目標中查詢記錄上的欄位,或將查詢的記錄移至另一個資料表或檢視表。
若要啟用此功能,您必須在 Oracle 資料庫配接器上指定特定系結屬性。 您也可以在連線 URI 中設定 PollingId 屬性,以修改 POLLINGSTMT 作業的目標命名空間。 如需詳細資訊,請參閱 支援在 Oracle 資料庫中接收輪詢型資料變更訊息 和 在 Oracle 資料庫配接器中接收輪詢型資料變更訊息。 如需輪詢作業之 SOAP 訊息結構的相關資訊,請參閱 輪詢作業的訊息架構2。
使用 Oracle 資料庫配接器系結屬性設定輪詢作業
下表摘要說明您用來設定配接器以接收資料變更訊息的 Oracle 資料庫配接器系結屬性。 在 BizTalk Server 管理主控台中設定接收埠時,您必須指定這些系結屬性。
Binding 屬性 | Description |
---|---|
InboundOperationType | 指定您要執行輪詢或通知輸入作業。 預設值為 Polling。 |
PolledDataAvailableStatement | 指定配接器執行的 SQL 語句,以判斷是否有任何資料可供輪詢。 只有在記錄可供使用時,才會執行您為 PollingStatement 系結屬性指定的 SELECT 語句。 預設值為 SELECT 1 FROM DUAL ,這表示不論所輪詢的資料表是否有資料,配接器都必須繼續輪詢。 |
PollingInterval | 指定間隔,以秒為單位,Oracle Database 配接器會執行 針對 PolledDataAvailableStatement 系結屬性指定的語句。 預設值為 500 秒。 輪詢間隔會決定連續輪詢之間的時間間隔。 如果語句是在指定的間隔內執行,配接器會睡眠間隔中的剩餘時間。 |
PollingStatement | 指定輪詢語句。 若要使用 SELECT 語句輪詢,您必須為此系結屬性指定 SELECT 語句。 預設值是 null。 您必須指定 PollingStatement 系結屬性的值,才能啟用輪詢。 只有在有資料可供輪詢時,才會執行輪詢語句,這是由 PolledDataAvailableStatement 系結屬性所決定。 |
PollingAction | 指定輪詢作業的動作。 您可以使用取用配接器服務增益集,從為作業產生的中繼資料,判斷特定作業的輪詢動作。 |
PostPollStatement | 指定執行 PollingStatement 系結屬性所指定的語句之後所執行的語句區塊。 |
PollWhileDataFound | 指定如果正在輪詢的資料表中有資料可用,Oracle 資料庫配接器是否忽略輪詢間隔,並持續執行輪詢語句。 如果資料表中沒有可用的資料,配接器會還原為在指定的輪詢間隔執行輪詢語句。 預設值為 false。 |
如需這些屬性的更完整描述,請參閱 閱讀 Oracle 資料庫配接器系結屬性。 如需如何使用 Oracle 資料庫配接器輪詢 Oracle 資料庫的完整描述,請參閱進一步瞭解。
本主題示範輪詢的方式
在本主題中,若要示範 Oracle 資料庫配接器如何支援使用 SELECT 語句接收資料變更訊息,請建立 BizTalk 專案並藉由將PollingStatement系結屬性設定為下列專案來產生POLLINGSTMT作業的架構:
SELECT * FROM ACCOUNTACTIVITY FOR UPDATE
當您執行範例所提供的 SQL 腳本,以在資料庫中建立這些物件時,就會建立 ACCOUNTACTIVITY 資料表。
注意
本主題中的協調流程會輪詢 ACCOUNTACTIVITY 資料表,這是藉由執行範例所提供的腳本所建立的基底資料庫資料表。 您必須執行本主題中所述的類似程式,才能輪詢任何其他資料表。
為了示範輪詢作業,我們會執行下列動作:
指定 PolledDataAvailableStatement 系結屬性的 SELECT 語句,以判斷要輪詢的資料表 (ACCOUNTACTIVITY) 具有任何資料的位置。 在此範例中,您可以將此系結屬性設定為:
SELECT COUNT (*) FROM ACCOUNTACTIVITY
這可確保配接器只有在 ACCOUNTACTIVITY 資料表有一些記錄時,才會執行輪詢語句。
針對 PollingStatement 系結屬性,指定先前所述的 SELECT 語句。 此語句會擷取 ACCOUNTACTIVITY 資料表中的所有資料列。
在 PostPollStatement 系結屬性中執行 PL/SQL 區塊。 此語句會將所有資料從 ACCOUNTACTIVITY 資料表移至資料庫中的另一個資料表。 一旦發生這種情況,下次執行 針對 PollingStatement 指定的語句時,它就不會擷取任何資料。
在將更多資料新增至 ACCOUNTACTIVITY 資料表之前,您不會收到任何輪詢訊息。 因此,您必須使用新的記錄重新填入 ACCOUNTACTIVITY 資料表。 您可以執行範例所提供的 more_activity_data.sql 腳本來執行此動作。 執行此腳本之後,下一個輪詢作業會擷取插入資料表的新記錄。
如何從 Oracle 接收資料變更訊息
使用 Oracle Database 配接器搭配 BizTalk Server 在 Oracle 資料庫上執行作業牽涉到下列程式性工作,如建置組塊中所述,使用 Oracle Database 開發 BizTalk 應用程式。 若要設定配接器以使用 SELECT 語句輪詢 Oracle 資料庫,這些工作如下:
建立 BizTalk 專案,並針對您要輪詢的資料表產生 POLLINGSTMT 作業的架構。
在 BizTalk 專案中建立訊息,以接收來自 Oracle 資料庫的訊息。
建立協調流程以接收來自 Oracle 的訊息,並將其儲存至資料夾。
建置和部署 BizTalk 專案。
藉由建立實體傳送和接收埠來設定 BizTalk 應用程式。
重要
針對輸入輪詢案例,您必須一律設定單向接收埠。 輸入作業不支援雙向接收埠。
啟動 BizTalk 應用程式。
本主題提供執行這些工作的指示。
產生架構
您必須產生 POLLINGSTMT 作業的架構。 使用取用配接器服務增益集產生架構時,請執行下列工作。
產生架構時,指定 PollingStatement 系結屬性的值。 如需這個系結屬性的詳細資訊,請參閱 閱讀 Oracle 資料庫配接器系結屬性。 例如,將下列專案指定為輪詢語句:
SELECT * FROM ACCOUNTACTIVITY FOR UPDATE
) 選取合約類型作為 [服務 (輸入作業 ]。
產生 POLLINGSTMT 作業的架構。
如需如何產生架構的詳細資訊,請參閱 流覽、搜尋及取得 Oracle 資料庫作業的中繼資料。
定義訊息和訊息類型
您稍早產生的架構描述協調流程中訊息所需的「類型」。 訊息通常是變數,其類型是由對應的架構所定義。 產生架構之後,您必須從 BizTalk 專案的協調流程檢視將其連結至訊息。
針對本主題,您必須建立一則訊息以接收來自 Oracle 的訊息。
執行下列步驟來建立訊息,並將其連結至架構。
建立訊息並連結至架構
將協調流程新增至 BizTalk 專案。 從方案總管,以滑鼠右鍵按一下 BizTalk 專案名稱,指向 [新增],然後按一下 [新增專案]。 輸入 BizTalk 協調流程的名稱,然後按一下 [ 新增]。
如果 BizTalk 專案尚未開啟,請開啟協調流程檢視視窗。 按一下 [檢視],指向 [其他視窗],然後按一下 [ 協調流程檢視]。
在協調 流程檢視中,以滑鼠右鍵按一下 [ 訊息],然後按一下 [ 新增訊息]。
以滑鼠右鍵按一下新建立的訊息,然後選取 [ 屬性視窗]。
在Message_1的 [屬性]窗格中,執行下列動作:
使用 作法 識別碼 輸入 Receive。 訊息類型 從下拉式清單中展開 [ 架構],然後選取 [TablePolling.OracleDBBinding],其中 TablePolling 是您 BizTalk 專案的名稱。 OracleDBBindingSchema 是針對 ACCOUNTACTIVITY 資料表 上的 POLLINGSTMT 作業所產生的回應架構。
重要 因為輪詢是單向作業,所以介面卡所產生的架構不包含回應節點,因此架構中只有一個根節點。 如果您針對訊息類型使用這類架構,則必須依產生的架構檔案名來識別架構。
例如,如果您為雙向作業建立架構,則具有名稱OracleDBBindingSchema
的架構檔案中的節點看起來可能會像 「要求」和「回應」。 如果您想要在對應至要求架構的協調流程中建立訊息,您可以尋找OracleDBBindingSchema.Request
來識別清單中的架構。 不過,在輪詢作業的情況下,因為唯一的節點是 「POLLINGSTMT」,所以不容易識別您想要對應的架構,因為具有單一節點的架構不會列為 < schemafilename > 。 <rootnodename > 。 相反地,這類架構只會以檔案名列出。 在這種情況下,識別架構的唯一方法是依架構檔名,例如 OracleDBBindingSchema。
設定協調流程
您必須建立 BizTalk 協調流程,以使用BizTalk Server從 Oracle 接收輪詢型資料變更訊息。 在此協調流程中,配接器會執行 針對 PollingStatement 系結屬性指定的 SELECT 語句來接收回應。 SELECT 語句的回應訊息會儲存至 FILE 位置。 輪詢 Oracle 資料庫的一般協調流程會包含:
接收和傳送圖形以接收來自 Oracle 的訊息,並分別傳送至 FILE 埠。
單向接收埠,可從 Oracle 資料庫接收訊息。
重要
針對輸入輪詢案例,您必須一律設定單向接收埠。 輸入作業不支援雙向接收埠。
單向傳送埠,可從 Oracle 資料庫傳送輪詢回應。
範例協調流程如下所示。
Oracle
新增訊息圖形
請確定您為每個訊息圖形指定下列屬性。 Shape 資料行中列出的名稱是訊息圖形的名稱,如剛才提及的協調流程所示。
圖形 | 圖形類型 | 屬性 |
---|---|---|
ReceiveMessage | 接收 | - 將 [名稱 ] 設定為 ReceiveMessage - 將 Activate 設定為 True |
SaveMessage | 傳送 | - 將 [名稱 ] 設定為 SaveMessage |
新增埠
請確定您為每個邏輯埠指定下列屬性。 [埠] 資料行中列出的名稱是協調流程中顯示的埠名稱。
連接埠 | 屬性 |
---|---|
OracleReceivePort | - 將 識別碼 設定為 OracleReceivePort - 將 類型 設定為 OracleReceivePortType - 將 通訊模式 設定為 單向 - 將 通訊方向 設定為 接收 |
SaveMessagePort | - 將 識別碼 設定為 SaveMessagePort - 將 類型 設定為 SaveMessagePortType - 將 通訊模式 設定為 單向 - 設定要傳送的通訊方向 |
指定動作圖形的訊息並連接到埠
下表指定屬性及其值,您應該設定為指定動作圖形的訊息,以及將訊息連結至埠。 Shape 資料行中列出的名稱是訊息圖形的名稱,如先前所述的協調流程所示。
圖形 | 屬性 |
---|---|
ReceiveMessage | - 設定要接收的訊息 - 將 作業 設定為 OracleReceivePort.Polling.Request |
SaveMessage | - 設定要接收的訊息 - 將 作業 設定為 SaveMessagePort.Polling.Request |
指定這些屬性之後,訊息圖形和埠就會連線,而且您的協調流程已完成。
您現在必須建置 BizTalk 解決方案,並將其部署至BizTalk Server。 如需詳細資訊,請參閱 建置和執行協調流程。
設定 BizTalk 應用程式
部署 BizTalk 專案之後,您稍早建立的協調流程會列在 [BizTalk Server 管理主控台] 的 [協調流程] 窗格中。 您必須使用 BizTalk Server 管理主控台來設定應用程式。 如需逐步解說,請參閱逐步解說 :部署基本 BizTalk 應用程式。
設定應用程式牽涉到:
選取應用程式的主機。
將您在協調流程中建立的埠對應至 BizTalk Server 管理主控台中的實體埠。 針對此協調流程,您必須:
定義硬碟上的位置,以及 BizTalk 協調流程將從 Oracle 卸載訊息的對應 FILE 埠。 這些訊息將會回應您為接收埠指定的輪詢語句。
定義實體 WCF-Custom 或單向接收埠 WCF-OracleDB。 此埠會輪詢 Oracle 資料庫。 如需如何建立接收埠的詳細資訊,請參閱 手動設定實體埠系結至 Oracle 資料庫配接器。 請確定您為接收埠指定下列系結屬性。
Binding 屬性 值 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 資料庫配接器會繼續輪詢,直到您從 BizTalk Server 管理主控台明確停用接收埠為止。
可能的例外狀況
如需您在使用 BizTalk Server 在 Oracle 資料庫上執行輪詢查詢時可能會遇到的例外狀況相關資訊,請參閱 Oracle 資料庫配接器的例外狀況和錯誤處理。
最佳做法
部署並設定 BizTalk 專案之後,您可以將組態設定匯出至稱為系結檔案的 XML 檔案。 產生系結檔案之後,您可以從檔案匯入組態設定,如此您就不需要為相同的協調流程建立傳送埠和接收埠。 如需系結檔案的詳細資訊,請參閱 重複使用 Oracle 資料庫配接器系結。