REXX 语言环境允许您运行 REXX 程序。
要使用 REXX 语言环境,需要验证 Net.Data 初始化设置,并设置语言环境。
验证以下配置语句是否在初始化文件中,在一行上:
ENVIRONMENT (DTW_REXX) DTWREXX ( OUT RETURN_CODE )
参见环境配置语句以了解有关 Net.Data 初始化文件和语言环境 ENVIRONMENT 语句的信息。
借助 REXX 语言环境,可执行联机 REXX 程序或外部 REXX 程序。联机 REXX 程序是 REXX 程序源代码在宏中的 REXX 程序。外部 REXX 程序的 REXX 程序源代码在外部文件中。
要执行联机 REXX 程序:
定义一个使用 REXX (DTW_REXX) 语言环境的函数,该函数将 REXX 代码包含在语言环境可执行部分。
示例:包含联机 REXX 程序的函数
%function(DTW_REXX) helloWorld() { SAY 'Hello World' %}
要运行外部 REXX 程序:
定义一个使用 REXX (DTW_REXX) 语言环境的函数,并包括指向要在 EXEC 语句中运行的 REXX 程序的路径。
示例: 包含指向外部程序的 EXEC 语句的函数
%function(DTW_REXX) externalHelloWorld() { %EXEC{ helloworld.exe%} %}
要求: 确保 REXX 文件名列示在对 Net.Data 初始化文件中的 EXEC_PATH 配置变量指定的路径中。 参见EXEC_PATH以了解如何定义 EXEC_PATH 配置变量。
有两种方法可将信息传送至由 REXX (DTW_REXX) 语言环境调用的 REXX 程序, 即直接方式和间接方式。
%FUNCTION(DTW_REXX) rexx1() { %EXEC{ CALL1.CMD $(INPARM) "literal string" %} %}
Net.Data 变量 INPARM1 未被引用,且会被传送至外部 REXX 程序。 REXX 程序可通过使用 REXX PARSE ARG 指令来引用该变量。 使用此方法传送至程序的参数会被视作输入类型参数 (传送至程序的参数可由程序使用和处理,但对这些参数的更改不会反映给 Net.Data)。
以间接方式传送参数,通过使用 REXX 程序变量存储池来进行。 REXX 程序启动时,会创建一个包含有关所有变量的信息的空间,并由 REXX 解释程序来维护。此空间称为变量存储池。
调用 REXX 语言环境 (DTW_REXX) 函数时, 所有输入 (IN) 或输入/输出 (INOUT) 类型的函数参数都会在执行 REXX 程序之前由 REXX 语言环境存储在变量池中。 调用 REXX 程序时,它可直接存取这些变量。 在 REXX 程序成功完成时,DTW_REXX 语言环境会确定是否有任何输出 (OUT) 或 INOUT 函数参数。如果有的话,语言环境会检索与变量池中的函数参数对应的值,并将函数参数值更新为新值。 如果 Net.Data 接收到控制,则它会将所有的 OUT 或 INOUT 参数更新为从 REXX 语言环境中获得的值。例如:
%DEFINE a = "3" %DEFINE b = "0" %FUNCTION(DTW_REXX) double_func(IN inp1, OUT outp1){ outp1 = 2*inp1 %} %HTML(REPORT) { Value of b is $(b), @double_func(a, b) Value of b is $(b) %}
在上述示例中, 调用 @double_func 会传送两个参数 a 和 b。REXX 函数 double_func 会将首个参数翻倍,并将结果存储在第二个参数中。 Net.Data 调用宏时,b 的值为 6。
您可将 Net.Data 表传送至 REXX 程序。REXX 程序会将 Net.Data 宏表参数的值作为 REXX 主变量存取。 对于 REXX 程序,列标题和字段值都包含在由表名和列号标识的变量中。 例如,在表 myTable 中,列标题为 myTable_N.j, 而字段值为 myTable_N.i.j,其中 i 是行号,而 j 是列号。表中的行数为 myTable_ROWS,而表中的列数为 myTable_COLS。
如果在 AIX 上对 REXX 语言环境进行了多次调用, 考虑将 RXQUEUE_OWNER_PID 环境变量设置为 0。对 REXX 语言环境进行了多次调用的宏很容易产生多个进程, 从而占用大量系统资源。
您可以下列三种方式之一来设置环境变量:
@DTW_rSETENV("RXQUEUE_OWNER_PID", "0")
/etc/environment: RXQUEUE_OWNER_PID = 0
此方法会影响整台机器的 REXX 行为。
InheritEnv RXQUEUE_OWNER_PID = 0
此方法会影响 Web 服务器的 REXX 行为。
下列示例显示了一个宏,该宏会调用 REXX 函数来生成包含两列三行的一个 Net.Data 表。根据对 REXX 函数的调用, 调用内部函数 DTW_TB_TABLE() 来生成一个会回送至浏览器的 HTML 表。
%DEFINE myTable = %TABLE %DEFINE DTW_DEFAULT_REPORT = "NO" %FUNCTION(DTW_REXX) genTable(out out_table) { out_table_ROWS = 3 out_table_COLS = 2 /* Set Column Headings */ do j=1 to out_table_COLS out_table_N.j = 'COL'j end /* Set the fields in the row */ do i = 1 to out_table_ROWS do j = 1 to out_table_COLS out_table_V.i.j = '[' i j ']' end end %} %HTML(REPORT) { @genTable(myTable) @DTW_TB_TABLE(myTable) %}
Results:
COL1 COL2 [ 1 1 ] [ 1 2 ] [ 2 1 ] [ 2 2 ] [ 3 1 ] [ 3 2 ]