經由在函數定義上指定參數類型,以及指定將傳遞的參數是僅輸入 (IN)、 僅輸出 (OUT) 或輸入/輸出 (INOUT) 參數,將參數傳遞到程式。例如:
%function(DTW_DIRECTCALL) dc2(IN CHAR(3) p1,
INOUT INTEGER p2,
OUT DECIMAL(7,2) p3) {
%EXEC { /QSYS.LIB/NETDATA.LIB/MYPGM.PGM %}
%}
在上面範例中,「直接呼叫」語言環境將傳遞這三個參數到程式 MYPGM: 字元變數、整數及聚集十進位變數。您最多可傳遞 50 個參數到呼叫的程式。 僅有以資料類型指定的參數才能傳遞到程式。「直接呼叫」語言環境會將對應到參數的字串, 轉換為資料類型的內部表示式。然後,語言環境會按照函數定義上指定的次序, 將變數的內部表示式的指標傳遞到呼叫的程式。
因為變數的指標將傳遞到程式,所以程式可以變更變數的值。不過, 僅有 OUT 或 INOUT 變數,在經過程式變更後,才會向呼叫語言環境的巨集反映。
表 4會列示「直接呼叫」語言環境支援的資料類型。並非所有資料類型均受到每一高階語言的支援。
| 資料類型 | 用法注意事項 |
|---|---|
|
CHAR(n) CHARACTER(n) CHARACTER | 字串。如果指定 n, 它必須大於 0 的值。如果未指定字串,將假設為一個字元。 因為所有從「直接呼叫」語言環境傳遞的字串均是以空值終止, 所以語言環境將配置 n+1 個位元組 ( 1 個位元組供 NULL (空值) 終止符使用)。 超出 n 的字串將被截斷。 |
| VARCHAR(n) | 可變長度字串,其中 n 是大於 0,小於或等於 32740 的值。 字串是空值終止,所以語言環境會配置 n+2+1 個位元組 (2 個位元組用於儲存字串長度, 1 個位元組用於儲存空值終止符)。超出 n 的字串將被截斷。 字串的前兩個位元組含有字串長度 (二進位值)。如果參數定義為 OUT (僅輸出), 則在變數傳遞到呼叫的程式之前,字串長度將設定為 0。 |
|
INTEGER INT | 帶正負號的二進位整數,長度為 4 個位元組。 |
| SMALLINT | 帶正負號的二進位整數,長度為 2 個位元組。 |
| FLOAT(p,s) | 單精準度或倍精準度浮點數。對於單精準度,p 必須大於 0, 小於 25。對於倍精準度,p 必須大於 24, 小於 54。僅在轉換資料為可顯示的格式 (如轉換為字串) 時, 才會使用精確度 (p) 及小數位數 (s)。 |
| REAL(p,s) | 單精準度浮點數。p 必須大於 0,小於 25。僅在轉換資料為可顯示的格式 (如轉換為字串) 時, 才會使用精確度 (p) 及小數位數 (s)。 |
|
DOUBLE (p,s) DOUBLEPRECISION(p,s) | 倍精準度浮點數。p 必須大於 0,小於 53。僅在轉換資料為可顯示的格式 (如轉換為字串) 時, 才會使用精確度 (p) 及小數位數 (s)。 |
| NUMERIC(p,s) | 區化十進位數,具有精確度 p 及小數位數 s。 p 的值須大於 0,小於 32。 |
|
DEC(p,s) DECIMAL(p,s) | 聚集十進位數,具有精確度 p 及小數位數 s。 p 的值須大於 0,小於 32。 |
| DTWTABLE | 用來將 Net.Data 表格傳遞到呼叫的程式的特殊資料類型。 「直接呼叫」語言環境會將指標傳遞到表格,然後可以使用 Net.Data 語言環境介面表格函數, 來操作它。 |
定義為數值的參數可以包括貨幣符號及三位數的區隔符號。 在傳遞變數到程式之前,當數值變數從字串格式轉換為它的內部格式時, 「直接呼叫」語言環境會除去貨幣符號及三位數的區隔符號。 Net.Data 會從 Net.Data 執行所在的處理的處理屬性中,取回貨幣符號、小數格式及三位數的分隔字元。
在架構檔或巨集內,若 DTW_PAD_PGM_PARMS 設定為 NO,則「直接呼叫」語言環境 將使用空值終止符字元 (值 x'00'),將字串值傳遞到您的程式。 這需要您撰寫程式碼,來處理字串 (除非您正在使用 C 或 C++, 因為它會預期以空值終止的字串)。
例如,如果您將參數欄位定義為 CHAR(10),但您傳遞一個長度為 5 個位元組的字串值, 則 Net.Data 會在第 5 個位元組之後放置空值終止符。 在 CHAR(10) 欄位中,以字串形式傳遞值 "12345" 將產生:
x'F1F2F3F4F500........'
空值終止符後的位元組沒有定義 (您無法假設位元組是空值或空白)。
因為字串是以空值終止,且在空值終止符後含有未起始設定的位元組,所以您無法在 RPG 或 COBOL 程式中使用字串。 例如,如果您在比較作業中使用字串,則作業將不會產生有效的結果。 程式不會預期字串含有空值終止符,而是預期將在尾端以空白填補的字串。
您可以在程式內使用字串處理函數,取回字串值或使用 VARCHAR 資料類型。 這種方法會在前兩個位元組中給與字串的長度。
在架構檔或巨集內,若 DTW_PAD_PGM_PARMS 設定為 YES, 則「直接呼叫」語言環境會將字串值傳遞到您的程式, 而這個值的右邊將填補空白,直到符合精確度長度。 使用上面的同一範例,但 DTW_PAD_PGM_PARMS 設定為 YES, 在 CHAR(10) 欄位中,以字串形式傳遞值 "12345" 將產生:
x'F1F2F3F4F5404040404000'
因為字串長度為 5,少於指定的精確度,所以將在值的後面插入空白, 直到符合精確度長度。以如 RPG 的語言撰寫的程式現在可以使用參數, 不需要處理以空值終止的字串。
下列列示描述當使用「直接呼叫」語言環境呼叫程式,以及將參數傳遞到程式時, 可能發生的錯誤。 也會提供避免這些錯誤的秘訣。