資料倉儲中心管理手冊


自行撰寫要與資料倉儲中心合用的程式

您可以使用支援下列程式類型之一的任何語言來撰寫程式:可執行檔、批次程式、動態鏈結程式庫或儲存程序。

如果使用者定義程式的程式類型為可執行檔、批次程式、批次指令檔或動態鏈結程式庫,則它必須常駐於代理程式端。倉儲代理程式會依排定的時間來啟動程式。在 Windows NT 上,代理程式預設會被當作系統程序的身份來執行,也就是說,該程式無法存取需要使用者 ID 的資源或程式。此外,程式在存取時所需的任何環境變數,都必須是系統變數。

如果您使用 Object REXX for Windows 來撰寫使用者定義程式,則完成下列程序可以讓這些程式在 Windows NT 之下執行:

  1. 將倉儲代理程式或伺服器服務定義為可與 Windows NT 桌面互動的系統程序:
    1. 服務清單中選取代理程式或伺服器服務。
    2. 按一下啟動
    3. 按一下系統帳戶
    4. 選取容許服務與桌面互動勾選框。
  2. 在倉儲代理程式或伺服器啟動程式之前,起始設定 Object REXX 環境。您可以從指令行執行任何 Object REXX 程式來起始設定環境。
  3. 如果您的 Object REXX 程式發出 DB2 CONNECT 陳述式,請驗證這個陳述式是否如同下列範例所示,確實含有使用者 ID 和通行碼:
    DB2 CONNECT TO testdb USER db2admin USING db2pass
    

如果使用者定義程式的程式類型為儲存程序,則該程式必須常駐在與執行程式之步驟相關的倉儲資料庫內。

傳送參數

在執行期間,資料倉儲中心會產生指令行參數清單,並將這些參數當作使用者定義程式的輸入來傳送。如果可能,在步驟使用這個程式之前,請先從指令行測試這個程式。

範例:您要撰寫 Windows NT 工作站上定期檢查檔案的使用者定義程式。它會使用下列參數:

這個程式會如圖 15所示來取得參數:

圖 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>

您可以在回應檔中指定下列資訊:

回覆碼
<RC>return code</RC>,其中 return code 是一個正整數。

回覆碼警告旗號
<WARNING>1</WARNING> 將回覆碼警告旗號設定為開啟。如果此旗號被設為開始,則「工作進度」視窗的步驟處理程序狀態為「警告」。

資料倉儲中心系統訊息
<MSG>message text\n</MSG>

message text
一或多個訊息的文字

\n
換行字元。如果有多個訊息,則在每個訊息的尾端併入這個字元。

註解
<COMMENT>comment text</COMMENT>,其中 comment text 是註解文字。

已處理的資料列數
<ROWS>number of rows</ROWS>,其中 number of rows 是任何正整數。

已處理的位元組數
<BYTES>number of bytes</BYTES>,其中 number of bytes 是任何正整數。

SQLSTATE
<SQLSTATE>sqlstate string</SQLSTATE>,其中 sqlstate string 是長度大於 0 且小於等於 5 位數的任何字串。

圖 16 顯示一個回應檔的範例。

圖 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 列出這些值的可能組合,以及它們所產生的結果。

表 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> 的值

註:

  1. 步驟處理程序狀態,如「工作進度」視窗所示。

  2. 資料倉儲中心會檢查回應檔是否存在,而不論使用者定義程式的回覆碼是 0 或非零。

  3. 回應檔內 <RC> 的值會固定顯示為「日誌明細」視窗 RC2 欄位的值。


[ 頁面頂端 | 前一頁 | 下一頁 | 目錄 | 索引 ]