您可以使用支援下列程式類型之一的任何語言來撰寫程式:可執行檔、批次程式、動態鏈結程式庫或儲存程序。
如果使用者定義程式的程式類型為可執行檔、批次程式、批次指令檔或動態鏈結程式庫,則它必須常駐於代理程式端。倉儲代理程式會依排定的時間來啟動程式。在 Windows NT 上,代理程式預設會被當作系統程序的身份來執行,也就是說,該程式無法存取需要使用者 ID 的資源或程式。此外,程式在存取時所需的任何環境變數,都必須是系統變數。
如果您使用 Object REXX for Windows 來撰寫使用者定義程式,則完成下列程序可以讓這些程式在 Windows NT 之下執行:
DB2 CONNECT TO testdb USER db2admin USING db2pass
如果使用者定義程式的程式類型為儲存程序,則該程式必須常駐在與執行程式之步驟相關的倉儲資料庫內。
在執行期間,資料倉儲中心會產生指令行參數清單,並將這些參數當作使用者定義程式的輸入來傳送。如果可能,在步驟使用這個程式之前,請先從指令行測試這個程式。
範例:您要撰寫 Windows NT 工作站上定期檢查檔案的使用者定義程式。它會使用下列參數:
這個程式會如圖 15所示來取得參數:
char *remoteFile = argv[1]; int interval = 5; // check every 5 minutes int timeout = 60; // time-out period in minutes if( (argc==3) || (argc==4) ) { if( NumStrValidation( argv[2] ) ) // get polling interval { interval = atoi( argv[2] ); if( interval == 0 ) interval = 5; // used the original one } else { trace << "Invalid value for polling interval\n"; flush(trace); return PARAMETER_ERROR; } if( argc==4 ) // get timeout period { if( NumStrValidation( argv[3] ) ) { timeout= atoi( argv[3] ); if( timeout == 0 ) timeout = 480; // used the original one } else { trace << "Invalid value for timeout period\n"; flush(trace); return PARAMETER_ERROR; } } } |
您的程式執行之後,必須傳回一個回覆碼給使用該程式的步驟。回覆碼必須是一個正整數。如果您的程式未傳回回覆碼,則使用該程式的步驟會失效。當錯誤 RC 1 的值是 8410 時,資料倉儲中心會在「日誌明細」視窗的錯誤 RC2 欄位中顯示回覆碼。如果錯誤 RC2 的值是 0 時,則此程式會順利執行而不會發生錯誤。
您的程式還可以將其它狀態資訊傳回給資料倉儲中心:
倉儲代理程式會將其它狀態資訊傳送給倉儲伺服器。
如果要將其它狀態資訊轉送給代理程式,您的程式必須建立一個稱為回應檔的檔案,其中含有其它的狀態資訊。回應檔的路徑和檔案名稱指定於倉儲代理程式在呼叫倉儲程式之前所設定的 VWP_LOG 環境變數中。您的程式必須讀取這個使用適當系統呼叫的變數值,建立回應檔。使用者定義程式執行完成之後,倉儲代理程式會檢查回應檔是否存在。如果存在,則代理程式會處理這個檔案。 否則,倉儲代理程式不會執行任何動作。如果使用者定義程式無法建立檔案,則應該會繼續執行。
您的使用者定義程式可以依照任何次序,將其它狀態資訊寫入回應檔中,不過,它必須使用下列格式來識別資訊。在下列清單中,使用了開始標籤
<Tag> 和結束標籤 </Tag>
將傳回的每個項目括住。每個開始標籤之後,都必須有一個結束標籤;同一列中不能有兩個開始標籤。例如,下面這一行是有效的標籤格式:
<RC>...</RC>...<MSG>...</MSG>
下面的內含標籤格式則無效:
<RC>...<MSG>...</RC>...</MSG>
您可以在回應檔中指定下列資訊:
圖 16 顯示一個回應檔的範例。
<RC> 20</RC> <ROWS>2345</ROWS> <MSG> 參數類型不正確 </MSG> <COMMENT> 請提供正確的參數類型 (PASSWORD NOTREQUIRED, GETPASSWORD, ENTERPASSWORD)</COMMENT> <BYTES> 123456</BYTES> <WARNING> 1</WARNING> <SQLSTATE>12345</SQLSTATE> |
根據下列由程式所設的值而定,顯示在日誌檢視器內的使用者定義程式回覆碼和步驟狀態也會有所不同:
表 17 列出這些值的可能組合,以及它們所產生的結果。
狀況 | 結果 | ||||
---|---|---|---|---|---|
步驟狀態 1 | 錯誤 RC1 和 RC2 的值 | ||||
使用者定義程式回覆碼為 0 | 沒有回應檔 2 | 順利完成 |
RC1 = 0; RC2 = 0
| ||
有回應檔 2 | 回應檔內 <RC> 的值是 0 3 | 回應檔內未設定 <WARNING> | 順利完成 |
RC1 = 0; RC2 = 0
| |
回應檔內的 <WACNING> 的值是 1 | 警告 |
RC1 = 0; RC2 = 0
| |||
回應檔內 <RC> 的值是非 0 3 | 回應檔內未設定 <WARNING> | 失效 |
RC1 = 8410 (使用者定義程式失敗); RC2 = 回應檔內的 <RC> 值 | ||
回應檔內 <WARNING> 的值是 1 | 警告 |
RC1 = 0; RC2 = 回應檔內的 <RC> 值 | |||
使用者定義程式回覆碼是非零 | 沒有回應檔 2 | 失效 |
RC1 = 8410 (使用者定義程式失敗); RC2 = 使用者定義程式傳回的回覆碼
| ||
有回應檔 2 | 回應檔內 <RC> 的值是 0 3 | 回應檔內未設定 <WARNING> | 順利完成 |
RC1 = 0; RC2 = 0
| |
回應檔內 <WARNING> 的值是 1 | 警告 |
RC1 = 0; RC2 = 0
| |||
回應檔內 <RC> 的值是非 0 | 回應檔內未設定 <WARNING> | 失效 |
RC1 = 8410 (使用者定義程式失敗); RC2 = 使用者定義程式傳回的回覆碼
| ||
回應檔內 <WARNING> 的值是 1 | 警告 |
RC1 = 0; RC2 = 回應檔內 <RC> 的值
|
註: