Net.Data 允许您在 Net.Data 宏中定义和引用变量。另外,也可以将这些 变量从宏传送给语言环境,反之亦然。传送的变量名、值和文字串称为记号。Net.Data 对记号的大小没有限制,只要系统内存能处理,就可以传送任何记号。但是个别语言环境对记号大小可能会有所限制。
可以根据变量类型和是否具有预定义值来定义 Net.Data 变量。可以根据变量的定义 将这些变量分为以下类型:
以下章节将描述:
如果标识符具有全局作用域,则在执行单个请求期间可在宏中的任何位置引用它。标识符可见的区域称为它的作用域。作用域有 5 种类型:
如果您可以在一个宏中的任何地方引用一个标识符,则该标识符就具有全局作用域。 具有全局作用域的标识符有:
如果一个标识符的说明出现在任何块的外面,则它有此作用域。一个块以左括号 ({) 开始,以百分号加右括号 (%}) 结束。(此定义不包括 DEFINE 块。)与具有全局作用域的标识符不同,具有宏作用域的标识符只能由该宏中位于标识符 说明之后的项引用。
如果一个标识符满足以下条件, 则它具有函数块作用域:
如果一个标识符在函数定义的外面已经存在相同名称,那么 Net.Data 将使用函数块中的参数列表中的标识符。
如果一个标识符在函数外已 被说明或初始化并且没有在函数参数列表中说明,则该标识符不具有函数块作用域。标识符在函数块中的值保持不变, 除非由函数进行更新。
如果一个标识符只可以在 REPORT 块中被引用(例如表列名 N1、N2、 ...、Nn),则它具有报告块作用域。只有 Net.Data 隐式定义为表处理的一部分 的那些变量才可以具有报告块作用域。例示的任何其他变量都具有函数块作用域。
如果只可以从 ROW 块中调用一个标识符(例如表值名 V1、V2、...、Vn),则该标识 符具有行块作用域。只有 Net.Data 隐式定义为表处理的一部分的那些变量才可以具有行块作用域。例示的任何其他变量都具有函数块作用域。
Net.Data 宏中有三种定义变量的方式:
从表单或查询字符串数据接收到的变量值将覆盖 DEFINE 语句在 Net.Data 宏中设置的变量值。
定义一个变量以在 Net.Data 宏中使用 的最简单方式是使用 DEFINE 语句。语法如下:
%DEFINE variable_name="variable value" %DEFINE variable_name={ variable value on multiple lines of text %} %DEFINE{ variable_name1="variable value 1" variable_name2="variable value 2" %}
variable_name 是给予变量的名称。变量名必须以字母或下划线开头,可以包含任何字母数字字符、 下划线字符、句点或散列字符 (#)。所有变量名都是区分大小写的, 但 V_columnName 除外,它是一个表变量。
例如:
%DEFINE reply="hello"
变量 reply 具有值 hello。
单独的两个连续引号等于一个空串。例如:
%DEFINE empty=""
变量 empty 具有一个空字符串。
如果变量中包含特殊字符,例如行结束符, 则在该值两侧使用块花括号:
%DEFINE introduction={ Hello, My name is John. %}
要在字符串中包含引号,可以使用两个连续的引号。
%DEFINE HI="say ""hello"""
还可以使用块花括号来避免使用引号:
%DEFINE HI={ say "hello" %}
要在一个 DEFINE 语句中定义几个变量,可使 用 DEFINE 块:
%DEFINE{ variable1="value1" variable2="value2" variable3="value3" variable4="value4" %}
可以使用 HTML FORM 标记来 为变量赋值,这些标记有 SELECT、INPUT 和 TEXTAREA 标记。以下示例使用标准 HTML 表单标记来定义 Net.Data 变量:
<input name="variable_name" TYPE=... />
或
<select name="variable_name"> <option>value one <option>value two </select>
要指定跨多行或包含特殊字符(例如,引号)的变量,TEXTAREA 标记可用于:
<textarea name="variable_name" ROWS="4"> Please type the multi-line value of your variable here. </textarea>
variable_name 是 给予变量的名称,而变量值是根据表单中接收的输入来确定的。参见HTML 表单以获取关于如何在 Net.Data 宏中使用此类变量定义的 示例。
可以通过查询字符串将变量 传递给 Net.Data。例如:
http://www.ibm.com/cgi-bin/db2www/stdqry1.dtw/input?field=custno
在上例中, 变量名 field 和变量值 custno 指定 Net.Data 接收自查询 字符串的附加数据。Net.Data 接收并处理数据,如同来自表单数据一样。
您可以引用先前定义变量以返回它的值。要在 Net.Data 宏中引用一个变量,可在 $( 和 ) 中指定变量名。例如:
$(variableName) $(homeURL)
当 Net.Data 发现一个变量引用时,它用变量的值来替换变量引用。变量引用可以包含字符串、变量引用和函数调用。
可以动态生成变量名。如果列表中的个数无法预先确定,则通过这种技术可以使用循环来为运行时构建的列表 处理大小可变的表或输入数据。例如,可以生成 HTML 表单元素列表,这些表单元素是根据 SQL 查询 所返回的记录生成的。
要将变量作为文本显示语句的一部分使用,可在宏的 HTML 块中引用它们。
无效的变量引用:无效的变量引用将被分辨为空字符串。例如,如果一个变量引用包含了无效字符, 如惊叹号 (!),则该引用被解析为空字符串。
有效的变量名必须以字母数字字符或下划线开头,可以包含字母数字字符(包括句点、 下划线以及散列标记)。
示例 1: 链接中的变量引用
如果定义了变量 homeURL:
%DEFINE homeURL="http://www.ibm.com/"
您可以指向主页为 $(homeURL) 并创建一个链接:
<a href="$(homeURL)">Home page</a>
您可以在 Net.Data 宏中的许多部分引用变量;请查看本章中的语言结构以便确定在宏中的 哪些部分允许变量引用。如果变量在被引用时尚未被定义, Net.Data 将返回一个空字符串。单独的变量引用不定义变量。
示例 2: 动态生成变量引用
假定您在运行一个具有任意个成分的 SQL SELECT 语句。可以使用以下 ROW 块创建具有输入字段的 HTML 表单:
... %ROW { <input type=text name=@dtw_rconcat("I", ROW_NUM) size=10 maxlength=10 /> %} ...
因为创建了 INPUT 字段,您可能希望访问用户在向宏提交表单以备处理时输入的值。可以编写 一段代码(循环)来检索变量长度列表中的值:
<pre> ... @dtw_assign(rowIndex, "1") %while (rowIndex <= rowCount) { The value entered for row $(rowIndex) is: $(I$(rowIndex)) @dtw_add(rowIndex, "1", rowIndex) %} ... </pre>
Net.Data 先使用 I$(rowIndex) 引用生成变量名。例如,第一个变量名称是 I1。然后, Net.Data 就可以使用该值并分辨为变量的值。
示例 3:用嵌套的变量引用和函数调用进行变量引用
%define my = "my" %define u = "lower" %define myLOWERvar = "hey" $($(my)@dtw_ruppercase(u)var)
变量引用将返回 hey 的值。
可在宏中使用下列类型的变量。
如果您将字符串赋给变量,而变量由 Net.Data 定义为某种方式,例如 ENVVAR、LIST、 条件列表变量,则变量不再表现为定义的方式。换句话说,变量成为一个包含字符串的简单变量。
参见 Net.Data Reference 以获取有关每种类型的变量的语法和示例。
条件变量让您通过使用类似于 IF、THEN 结构的方法来为一个变量定义一个 条件值。在定义条件变量时,可以指定两个可能的变量值。如果引用的第一个变量存在,条件变量 将获取第一个值;否则获取第二个值。条件变量的语法是:
varA = varB ? "value_1" : "value_2"
如果 varB 已定义,则 varA="value_1",否则 varA="value_2"。这是等价于使用 IF 块, 如下例所示:
%IF (varB) varA = "value_1" %ELSE varA = "value_2" %ENDIF
参见列表变量以获取使用条件变量与列表变量的示例。
您可以引用那些 Web 服务器使之对正在处理您的 Net.Data 请求的进程或线程可用的环境变量。当引用 ENVVAR 变量时,Net.Data 返回同名的环境变量的当前值。
定义环境变量的语法是:
%DEFINE var=%ENVVAR
其中 var 是要定义的环境变量名。
例如,变量 SERVER_NAME 可被定义为环境变量:
%DEFINE SERVER_NAME=%ENVVAR
然后被引用:
The server is $(SERVER_NAME)
输出类似于:
The server is www.ibm.com
参见 Net.Data Reference 以了解有关 ENVVAR 语句的详情。
您可以用可执行变量来从变量引用中调用其他函数。
使用 DEFINE 块中的 EXEC 语言结构来定义 Net.Data 宏中的可执行变量。有关 EXEC 语言环境 元素的详情,参见 Net.Data Reference 中有关语言结构的章节。在下例中,定义了变量 runit 来执行可执行程序 testProg:
%DEFINE runit=%EXEC "testProg"runit 成为可执行变量。
Net.Data 在 Net.Data 宏中遇到一个有效变量时运行可执行程序。例如,当 Net.Data 宏中有一个有效变量引用建立成变量 runit 时,即执行 testProg 程序。
一种简单的方法是从另一个变量定义中引用一个可执行变量。以下示例演示了这个方法。变量 date 定义成 一个可执行变量,dateRpt 包含对可执行变量的引用。
%DEFINE date=%EXEC "date"
无论 $(date) 出现在 Net.Data 宏中的何处,Net.Data 都会搜索可执行程序 date,并在定位它时显示:
Today is Tue 11-07-1999
当 Net.Data 在宏中遇到可执行变量时,它将使用下列方法寻找被引用的可执行程序:
限制:不要将可执行变量设置成它调用的可执行程序的输出值。在先前 的示例中,变量 date 的值为空 (NULL)。如果在 DTW_ASSIGN 函数调用中使用此变量来把它的值 分配给另一个变量,则赋值后新变量的值也是空 (NULL)。 可执行变量的唯一目的是去调用它定义的程序。
也可以给要执行的程序,通过在变量定义上指定此程序名,将参数传送给它。在此例中,距离和 时间的值传送给程序 calcMPH。
%DEFINE mph=%EXEC "calcMPH $(distance) $(time)"
您可以使用隐藏变量,对用他们的 Web 浏览器查看您的 Web 页面源码的用户隐藏应用程序的实际 变量名。要定义隐藏变量:
%HTML(INPUT) { <form ...> <p>Select fields to view: shanghai<select name="field"> <option value="$$(name)"> Name <option value="$$(addr)"> Address ... </form> %} %DEFINE{ name="customer.name" addr="customer.address" %} %FUNCTION(DTW_SQL) mySelect() { SELECT $(Field) FROM customer %} ...
Web 浏览器显示 HTML 表单时,$$(name) 和 $$(addr) 分别被替换以 $(name) 和 $(addr),所以实际的表和列名肯定不出现在 HTML 表单上。应用程序用户无法区分实际变量名是隐藏的。当用户提交该表单时,调用 HTML(REPORT) 块。当 @mySelect() 调用 FUNCTION 块时,$(Field) 在 SQL 语句中用 SQL 查询的 customer.name 或 customer.addr 替换。
使用列表变量来构建一个定界的值字符串。当要构建一个具有多个项目的 SQL 查询时 (象某些 WHERE 或 HAVING 语句一样),它们特别有用。列表变量的语法是:
%LIST " value_separator " variable_name
建议:空格是必须的。在大多数情况下,在值分隔符之前和之后都插 一个空格。大部分查询都为值分隔符使用布尔或数学运算符(例如,AND、OR 或 >)。下例说明条 件、隐藏和列表变量的使用:
%HTML(INPUT) { <form method="post" action="/cgi-bin/db2www/example2.dtw/report"> <h2>Select one or more cities:</h2> <input type="checkbox" name="conditions" value="$$(cond1)" />Sao Paolo<br /> <input type="checkbox" name="conditions" value="$$(cond2)" />Seattle<br /> <input type="checkbox" name="conditions" value="$$(cond3)" />Shanghai<br /> <input type="submit" value="submit query" /> </form> %} %DEFINE{ DATABASE="custcity" %LIST " OR " conditions cond1="cond1='Sao Paolo'" cond2="cond2='Seattle'" cond3="cond3='Shanghai'" whereClause= ? "WHERE $(conditions)" %} %FUNCTION(DTW_SQL) mySelect() { SELECT name, city FROM citylist $(whereClause) %} %HTML(REPORT){ @mySelect() %}
在 HTML 表单中,如果没有选择任何框,则 conditions 是空的, 因此查询中的 whereClause 也是空的。否则,whereClause 中包含了选定的 值,值之间用 OR 分隔。例如,如果选择了所有这三个城市,则 SQL 查询为:
SELECT name, city FROM citylist WHERE cond1='Sao Paolo' OR cond2='Seattle' OR cond3='Shanghai'
此例显示已选择 Seattle,这出现在该 SQL 的结果中。
SELECT name, city FROM citylist WHERE cond1='Seattle'
表变量定义相关数据的集合。它包含一系列行和列,包括一行列标题。在 Net.Data 宏中如以下语句中所示地定义一个表:
%DEFINE myTable=%TABLE(30)
%TABLE 后面的数目是对此表变量可包含行数的限制。要指定不具有行数限制的表,可如下例所示 地使用缺省值或指定 ALL:
%DEFINE myTable2=%TABLE %DEFINE myTable3=%TABLE(ALL)
在定义表时,它具有零行和零列。用值填充表的 唯一方式是将它作为 OUT 或 INOUT 参数来传送给一个函数,或者使用 Net.Data 提供 的内置表函数。DTW_SQL 语言环境自动将 SELECT 语句的结果放到表中。
对于非数据库语言环境,例如 DTW_REXX 或 DTW_PERL,语言环境也负责设置表值。当然, 语言环境脚本或程序将逐格定义表值。参见使用语言环境以获取有关语言环境如何使用表变量的详情。
您可以通过引用表变量名来传送一个表。可以在一个函数的 REPORT 块中引用表中的个别元素,也可以使用 Net.Data 表函数来实现。参见表处理变量以了解如何在 REPORT 块中访问表内的个别元素, 参阅表函数以了解如何使用表函数来访问表的个别元素。 在 SQL 函数中表变量通常是填充了值的,然后,表变量在 SQL 函数或另一个函数中在作为参数传送给该函数之后,被用作对报告的输入。您可以将表变量作为 IN、OUT 或 INOUT 参数传送给任何非 SQL 函数。表只能作为 OUT 参数传递给 SQL 函数。
如果引用了一个表变量,则将显示表的内容, 并根据 DTW_HTML_TABLE 变量的设置对其进行格式化。在下面的示例中,将显示 myTable 的内容:
%HTML (output) { $(myTable) }
表中的列名和字段值被编址为起始地址为 1 的数组元素。
这些变量是 Net.Data 定义的变量,可用来:
杂项变量即可以具有 Net.Data 确定的预定义值,又可具有您设置的值。例如, Net.Data 根据正在处理的当前文件来确定 DTW_CURRENT_FILENAME 变量值,您可以在该文件中指定 Net.Data 是否除去由制表机和新行字符产生的额外空白。
预定义变量在宏中用作变量引用,并提供关于一个函数调用的状态、日期或文件的正确状态。例如, 要检索当前文件的名称,可使用:
%REPORT { <p>This file is <i>$(DTW_CURRENT_FILENAME)</i>.</p> }
通常使用 DEFINE 语句或 @DTW_ASSIGN() 函数来设置可修改变量值,可修改变量值可让您 影响 Net.Data 如何处理宏。例如,要指定是否除去空白,可以使用以下 DEFINE 语句:
%DEFINE DTW_REMOVE_WS="YES"
Net.Data 定义表处理变量供 REPORT 和 ROW 块使用。使用这些变量从 SQL 查询和函数调用 引用值。
表处理变量具有 Net.Data 确定的预定义值。这些变量允许您引用由正在处理的行、列或字段所调用的函数或者 SQL 查询的结果集中的值。您还可以访问关于正在处理的行数的信息或所有列名列表。
例如,在 Net.Data 处理来自 SQL 查询的结果集时,它为每个当前列名指定变量值,即 N1 赋给第一列,N2 赋给第二列等等。您可以为 Web 页面输出引用当前列名。
在宏中使用处理变量作为变量引用。例如,要检索正在处理的当前列名,可使用:
%REPORT { <p>Column 1 is <i>$(N1)</i>.</p> }
表处理变量还提供关于查询结果的信息。如下例所示,您可以在宏中引 用变量 TOTAL_ROWS 来显示在 SQL 查询中返回多少行。
Names found: $(TOTAL_ROWS)
一些表处理变量受其他变量或内置函数的影响。例如, TOTAL_ROWS 要求 DTW_SET_TOTAL_ROWS SQL 语言环境变量是激活的,因此在处理来自 SQL 查询或 函数调用的结果时,Net.Data 指定 TOTAL_ROWS 的值,这如下例所示:
%DEFINE DTW_SET_TOTAL_ROWS="YES" ... Names found: $(TOTAL_ROWS)
Net.Data 以缺省报告格式显示宏生成的 Web 页面输出。在 HTML 块中, 缺省报告格式使用 <pre> </pre> 标记或使用 HTML 表标记显示表。在 XML 块中, 使用 <RowSet>、<Row> 和 <Column> 标记。通过用显示输出的说明来定义 REPORT 块,或通过使用报告变量之一来防止生成缺省报告,可以覆盖缺省报告。
报告变量有助于您定制如何显示 Web 页面输出以及如何与缺省报告 和 Net.Data 表一起使用。必须先定义这些变量,然后才可以在 DEFINE 语句或 @DTW_ASSIGN() 函数中使用它们。
报告变量指定间隔、覆盖缺省报告格式、指定是应当使用 HTML 还是使用固定宽度字符来显示表输出,并指定其他显示特征。例如, 可将 DTW_HTML_TABLE 设置为“是”,而 Net.Data 将生成使用 HTML 表标记而不是纯文本格式的表来生成缺省报告。
%DEFINE ALIGN="YES" ... <p>Your query was on these columns: $(NLIST)
START_ROW_NUM 报告变量让您确定从哪一行开始显示查询的结果。例如, 以下变量值指定了 Net.Data 将在第三行开始显示查询的结果。
%DEFINE START_ROW_NUM = "3"
您还可以确定 Net.Data 是否对缺省格式使用 HTML 标记。当 DTW_HTML_TABLE 设置为 YES 时,将生成一个 HTML 表而不是文本格式的表。
%DEFINE DTW_HTML_TABLE="YES" %FUNCTION(DTW_SQL){ SELECT NAME, ADDRESS FROM $(qTable) %}
这些变量与语言环境一起使用并影响语言环境处理请求的方式。
通过使用这些变量,您可以执行诸如这样的任务:建立与数据库的连接、为 Java 小应用程序提供替换文本、启用 NLS 支持以及确定 SQL 语句的执行是否成功。
例如,您可以使用 SQL_STATE 变量来访问或者显示从数据库返回的 SQL 状态值。
%FUNCTION (DTW_SQL) val1() { select * from customer %REPORT { ... %ROW { ... %} SQLSTATE=$(SQL_STATE) %}
下一个示例显示怎样定义要访问哪个数据库。
%DEFINE DATABASE="CELDIAL"