Net.Data 被设计成允许按照可接插方式来添加新的语言和 数据库接口。这些语言环境是作为 DLL 或共享库来访问的。DLL 的名称是在 Net.Data 初始化文件 中配置的,并且与一个语言环境名称相关联。 每种语言环境必须支持由 Net.Data 定义的 一套标准接口。 当第一次遇到一个对指定此语言环境的 FUNCTION 模块的函数调用时,Net.Data 将 装入初始化文件中指定的 DLL。
Net.Data 负责对 Net.Data 宏进行语法分析、对 Net.Data 变量进行维护、与语言环境 之间进行交互、并根据 REPORT 和 MESSAGE 模块的说明对输出进行格式化。语言环境则支持 定义到 Net.Data 的接口、使得 Net.Data 参数对于一些语言相关形式的语言处理器是可 访问的、调用语言解释程序、并接收从语言相关形式的语言解释程序传回的变量。
Net.Data 提供了许多种语言环境,但不是所有的平台都能够支持所有的环境。 表 1中列出了 IBM 所支持的语言环境。若要确定您使用的 平台上是否支持某种语言环境,请参阅附录 Net.Data 参考指南。
REPORT 和 MESSAGE 模块可以出现在所有 FUNCTION 模块中。这些模块由 Net.Data 而 不是语言环境来处理的。
每次对语言环境进行函数调用时,Net.Data 都把 RETURN_CODE 变量设置为函数的 返回值。可以检查这个值来确定一个函数调用是否成功。 Net.Data 使用 RETURN_CODE 值 来处理为函数指定的任何局部或全局 MESSAGE 模块。为了与 DB2 WWW Connection 保持兼容, 将同一个值赋给 SQL_CODE。
这个表格显示了由 Net.Data 提供的语言环境。
在某些平台的 Net.Data 内部函数中,还使用了初始化文件中的 ENVIRONMENT 语句。请
参阅 Net.Data 中的 “自述文件”或“程序目录”,以获取有关您使用的语言环境
的详细信息。
| 语言环境 | 环境语句 | 说明 |
|---|---|---|
| Java 小应用程序 | DTW_APPLET | Java 小应用程序语言环境允许在 Net.Data 应用程序中 使用 Java 小应用程序。要生成一个小应用程序标记,必须提供小应用程序标记的限定词 和小应用程序参数表。 |
| 缺省 C 语言 | DTW_DEFAULT |
某些平台上的初始化文件包括 ENVIRONMENT 语句,
这是 Net.Data 内部函数所必需的。请参阅 Net.Data 参考
指南,以获取有关使用内部函数
的更多信息。
|
| 平面文件接口 | DTW_FFI |
在某些平台上可以使用平面文件接口(FFI),允许
您使用平面文件(或普通文本文件)作为数据源。还有一些平台通过在初始化文件中
使用 ENVIRONMENT 语句来支持 FFI。请参阅 Net.Data 程序
设计指南,以获取有关使用 FFI 的
更多信息。
|
| Java 应用程序 | DTW_JAVAPPS | Net.Data 使用 Java 语言环境支持现存的 Java 应用程序。 |
| ODBC | DTW_ODBC | ODBC** 语言环境通过一个 ODBC 接口来访问多个 数据库管理系统,以此来执行 SQL 语句。 |
| Oracle | DTW_ORA | Oracle** 语言环境允许您直接与 Oracle 数据进行通信。 |
| PERL | DTW_PERL | PERL 语言环境用于解释在 Net.Data 宏的 FUNCTION 模块 中指定的内部 PERL 脚本,或处理存储在单独文件中的外部 PERL 脚本。 |
| REXX | DTW_REXX | REXX 语言环境能够解释在 Net.Data 宏的 FUNCTION 模块 中指定的内部 REXX 程序,或执行存储在单独文件中的外部 REXX 程序。 |
| SQL | DTW_SQL | SQL 语言环境可以通过 DB2 执行 SQL 语句。SQL 语句 的结果可在一个表格变量中返回。 |
| Sybase** | DTW_SYB | Sybase** 语言环境允许您直接与 Sybase 数据进行通信。 |
| System | DTW_SYSTEM |
System 语言环境支持对某些外部程序的调用,
这些外部程序在 FUNCTION 模块的 EXEC 语句中标识。 System 语言环境通过将程序名
参数传递到操作系统执行来解释 EXEC 语句。
|
| Web 注册表 | DTW_WEBREG |
Net.Data Web 注册表提供在一些平台上,并为与
应用程序相关的数据提供持久性存储。 还有一些平台通过在初始化文件中
使用 ENVIRONMENT 语句来支持 Web 注册表。请参阅 Net.Data 程序
设计指南,以获取有关使用 Web 注册表的
更多信息。
|
每种语言环境都要求在初始化文件中有 ENVIRONMENT 语句,且在服务器 的 /lib 或 /dll 目录中有一个共享库或 dll 文件。在对 初始化文件进行修改之前,建议您作一个备份。
Java 小应用程序语言环境允许在 Net.Data 应用程序中使用标准的 Java 小应用程序。
要生成一个小应用程序标记,必须提供小应用程序标记的限定词(在这个例子中为代码、 代码库、宽度和高度)以及小应用程序的参数表。
下面的章节描述了用于生成小应用程序标记的函数调用语法、小应用程序标记限定词和 参数的语法。有关使用 Java 小应用程序后端程序的例子,请参阅***。
调用一个 Java 小应用程序的函数调用具有以下语法:
@DTWA_AppletName(parameter1, parameter2, ..., parameterN)
DTWA_ 前缀标识了用于生成小应用程序标记的函数 调用。AppletName 是要为之生成标记的小应用程序名称。这种 函数通常是在 HTML 节中调用的。
因为 HTML 标记可以不断更改,所以 Net.Data 有一种用于设置值的灵活、功效强大 的方法。您可以在 Net.Data 宏中的任何地方指定小应用程序标记限定词。 具有 AppletName.qualifier 形式的所有变量都作为限定词 被代入小应用程序标记中。以下是一个定义小应用程序限定词的例子:
%define AppletName.Qualifier = "value"
实际的赋值操作不一定要在 DEFINE 节中。可以使用 DTW_ASSIGN 函数来设置,或 在 SQL 节中自动设置。如果没有定义一个 AppletName.code 变量, 则将缺省的代码 参数添加到小应用程序标记中。代码参数的 的值是 AppletName.class,其中 AppletName 是小应用程序 的名称。
参数表是您在 Net.Data 中调用小应用程序时设置的。可以传递
每次总是生成名为 DTW_NUMBER_OF_TABLES 的 PARAM 标记。它的值是在函数中 使用的表格变量的个数。如果在函数调用中没有指定表格变量,则生成以下标记:
<param name = "DTW_NUMBER_OF_TABLES" value = "0" >
DTW_APPLET_ALTTEXT 变量可以用于在上一个 PARAM 标记和结束的 APPLET 标记之间 插入 HTML。这个变量所包含的 HTML 文本可以显示在不支持 APPLET 标记的浏览器中。
您可以把正常的 Net.Data 变量作为参数使用。例如,如果 在 DTWA_AppletName 函数调用中指定一个变量,则 生成一个 PARAM 标记,并且具有与此变量相同的名称和值。
同样可以把一个或多个表格变量作为参数使用。如果 在 DTWA_AppletName 函数调用中指定了一个 Net.Data 表格 变量,则生成几个额外的 PARAM 标记。首先,为表格生成一个 PARAM 标记,例如:
<param name = 'DTW_TABLE_i_NAME' value = "tname" >
变量 i 是表格的数目,tname 是表格的名称。
接着,生成用于指定表格行数和列数的 PARAM 标记,例如:
<param name = 'DTW_tname_NUMBER_OF_ROWS' value = "rows" > <param name = 'DTW_tname_NUMBER_OF_COLUMNS' value = "cols" >
表格名称是 tname,rows 是表格 的行数,cols 是表格的列数。 对于函数调用中指定的每个 唯一表格,生成这对标记。
然后,对于表格中的每列生成一个 PARAM 标记,例如:
<param name = 'DTW_tname_COLUMN_NAME_j' value = "cname" >
表格名称是 tname,j 是列号, cname 是表格的列名。
最后,生成包含每行中值的 PARAM 标记。
<param name = 'DTW_tname_cname_VALUE_k' value = "val" >
表格名称是 tname,cname 是列名, k 是行号,val 是与相应行列中的值 相匹配的值。
在一个函数调用中可将表格列作为参数来传递。 表格列参数具有以下格式:
@DTWA_AppletName(DTW_COLUMN( x )Table)
其中 x 是表格中的列名或列号。
对列参数也传递相同的参数,并且 DTW_tname_NUMBER_OF_COLUMNS 参数总是为 1, 只生成特定于此列的参数标记,而不生成表格中其它列的参数标记。
%define{
DATABASE = "celdial"
DTW_APPLET_ALTTEXT = "<P>Sorry, your browser is not Java-enabled."
DTW_HTML_TABLE = "yes"
DTW_SAVE_TABLE_IN = "MyTable"
MyGraph.codebase = "'MyMachine.ibm.com"
MyGraph.height = "200"
MyGraph.width = "400"
MyTitle = "This is my Title"
%}
%SQL(A){
select age, count(age)
as ages from guests
where age >= 35
group by age
%}
%HTML_REPORT{
%EXEC_SQL(A)
@DTWA_MyGraph( MyTitle, DTW_COLUMN(ages) MyTable )
%}
在这个 Net.Data 宏例子中,位于定义部分的这些行生成小应用程序标记的第一行:
MyGraph.codebase = "'MyMachine.ibm.com" MyGraph.height = "200" MyGraph.width = "400"
这个小应用程序包含以下这些限定词:
<applet code = 'MyGraph.class' codebase = 'MyMachine.ibm.com' width = '400' height = '200' >
Net.Data 宏文件中 SQL 节的 SQL 查询结果返回在缺省的结果表格 MyTable 中, 这个缺省表格由 DTW_SAVE_TABLE_IN = MyTable 这一行在定义部分设置。 对 @DTWA_MyGraph( MyTitle, DTW_COLUMN(ages) MyTable ) 宏中小应用程序的调用 将生成包含有关结果表格信息(如列数、返回的行数和结果行数)的完整小程序标记。对于 结果表格中的每个单元都生成一个参数标记,如下行所示:
param name = 'DTW_MyTable_ages_VALUE_1' value = "4">
参数名 DTW_MyTable_ages_VALUE_1 是指表格 MyTable 中的表格单元(行 1, 列 'ages'),它的值是 4。小应用程序调用中的关键字 DTW_COLUMN 指定了您只对 结果表格 MyTable 中的"ages"列感兴趣,如下所示:
@DTWA_MyGraph( MyTitle, DTW_COLUMN(ages) MyTable )
为这个例子生成的完整小应用程序标记如下所示:
<applet code = 'MyGraph.class' codebase = 'MyMachine.ibm.com' width = '400' height = '200' > <param name = 'MyTitle' value = "This is my Title" > <param name = 'DTW_NUMBER_OF_TABLES' value = "1" > <param name = 'DTW_TABLE_1_NAME' value = "MyTable" > <param name = 'DTW_MyTable_NUMBER_OF_ROWS' value = "5" > <param name = 'DTW_MyTable_NUMBER_OF_COLUMNS' value = "1" > <param name = 'DTW_MyTable_COLUMN_NAME_1' value = "ages" > <param name = 'DTW_MyTable_ages_VALUE_1' value = "4"> <param name = 'DTW_MyTable_ages_VALUE_2' value = "1"> <param name = 'DTW_MyTable_ages_VALUE_3' value = "1" > <param name = 'DTW_MyTable_ages_VALUE_4' value = "1" > <param name = 'DTW_MyTable_ages_VALUE_5' value = "1" > <P>Sorry, your browser is not Java-enabled.<BR> </applet>
我们建议从 DTW_Applet 类来生成小应用程序子类,因为这个类具有能够帮助处理 小应用程序标记的有用接口。Net.Data 提供以下这些接口:
下面的例子显示了使用这些接口从 DTW_Applet 类生成的一个小程序子类:
import java.io.*;
import java.applet.Applet;
public class myDriver extends DTW_Applet
{
public void init()
{
super.init();
if (GetNumberOfTables() > 0)
{
String [] tables = GetTableNames();
printTables(tables);
}
}
private void printTables(String[] tables)
{
String table_name;
for (int i = 0; i < tables.length; i++)
{
table_name = tables[i];
printTable(table_name);
}
}
private void printTable(String table_name)
{
int nrows = GetNumberOfRows(table_name);
int ncols = GetNumberOfColumns(table_name);
System.out.println("Table: " + table_name + " has " + ncols + " columns and " +
nrows + " rows.");
String [] col_names = GetColumnNames(table_name);
System.out.println("---------------------------------------------------------");
for (int i = 0; i < ncols; i++)
System.out.print(" " + col_names[i] + " ");
System.out.println("\n--------------------------------------------------------");
String [][] mytable = GetTable(table_name);
for (int j = 0; j < nrows; j++)
{
for (int i = 0; i < ncols; i++)
System.out.print(" " + mytable[i][j] + " ");
System.out.println("\n");
}
}
}
Net.Data 使用 Java 语言环境支持现存的 Java 应用程序。
Net.Data 增强了对“Java 数据库连接(JDBC**)”的支持;本版本通过 JDBC API 支持 用于访问 DB2 的 Java 小应用程序和 Java 方法(或应用程序)。
从以下这些场点可获得 JDBC 的细节:
http://www.software.ibm.com/data/db2/jdbc/
http://splash.javasoft.com/jdbc/
编写一个 Java JDBC 应用程序或小应用程序类似于编写一个使用 DB2 CLI 或 ODBC 来 访问数据库的 C 应用程序。 应用程序和小应用程序之间的主要区别在于,应用程序可能 需要特殊的软件(例如,DB2 Client Application Enabler)才能与 DB2 进行通信。而 小应用程序依赖于支持 Java 的 Web 浏览器,不需要在客户端安装 DB2 代码。
在使用 JDBC 之前,需要对系统进行一些配置。 这些考虑在 “DB2 JDBC Application and Applet Support”中讨论:
http://www.software.ibm.com/data/db2/jdbc/db2java.html
要从 Java 小应用程序中使用 JDBC,请在 Web 服务器上启动 DB2 的 JDBC 小应用程序服务器。 若要从 Java 方法中使用 JDBC:
“开放数据库连接(ODBC)”语言环境通过 ODBC 接口来执行 SQL 语句。 ODBC 基于 X/Open SQL CAE 规范, 允许单个应用程序访问多个数据库管理系统。
为了使用 ODBC 语言环境,必须安装 ODBC 驱动程序和驱动程序管理器。ODBC 驱动程序 文档描述了怎样安装和配置 ODBC 环境。
在 ODBC 环境中发送 SQL 语句类似于其它的 Net.Data 函数。 下面这个例子是一个 将多条 SQL 语句发送到一个 Oracle** 数据库的 Net.Data 宏。 使用 DATABASE 变量的 平台必须指定与 ODBC.INI 文件中的数据源相同的数据库。
%DEFINE{
DATABASE="qeora7"
SHOWSQL="YES"
table="int_null"
LOGIN="netdata1"
PASSWORD="ibmdb2"
%}
%function(dtw_odbc) oracle1() {
create table int_null (int1 int, int2 int)
%}
%function(dtw_odbc) oracle2() {
insert into $(table) (int1) values (111)
%}
%function(DTW_ODBC) oracle3() {
insert into $(table) (int2) values (222)
%}
%function(dtw_odbc) oracle4() {
select * from $(table)
%}
%function(DTW_ODBC) oracle5() {
drop table $(table)
%}
%HTML(REPORT) {
@oracle1()
@oracle2()
@oracle3()
@oracle4()
%}
Oracle 语言环境允许直接与 Oracle 数据进行通信。必须在服务器上 安装 Oracle 公司的 SQL*Net 。有关的更多信息,请参阅:
http://www.oracle.com/products/networking/html/stnd_sqlnet.html
这个语言环境不支持存储过程。访问 Oracle 数据库时不需要 DATABASE 变量。
在初始化文件中定义了 Oracle 语言环境并且运行 SQL*Net 后,就可以把数据 输出到 Web 上。可以使用如下函数来调用 Oracle 语言环境:
%FUNCTION(DTW_ORA) STL1() {
insert into $(table) (int1,int2) values (111,NULL)
%}
PERL 语言环境可以解释在 Net.Data 宏的 FUNCTION 模块中指定的内部 PERL 脚本, 还可以执行存储在单独文件中的外部 PERL 脚本。 对外部 PERL 脚本的调用在 FUNCTION 模块 中是由 EXEC 语句来标识的,例如:
%EXEC{ perl-script-name [optional parameters] %}
PERL 语言环境不能直接传递或检索 Net.Data 变量,因此这些变量是按以下方式 用于 PERL 脚本的:
以下 Net.Data 宏例子显示了这一过程。
%FUNCTION(DTW_PERL) today() RETURNS(result) {
$date = `date`;
chop $date;
open(DTW, "> $ENV{DTWPIPE}") || die "Could not open: $!";
print DTW "result = \"$date\"\n";
%}
%HTML(INPUT) {
@today()
%}
如果 PERL 脚本位于一个名为 today.prl 的外部文件中,则也可以象下面的例子这样 来编写同一个函数:
%FUNCTION(DTW_PERL) today() RETURNS(result) {
%EXEC { today.prl %}
%}
PERL 语言环境程序通过它们的 Net.Data 名称来存取表格参数的值。 表格 T 的列标题 是 T_N_i,其字段值是 T_V_i_j。
象在任何 FUNCTION 节中一样,允许出现 REPORT 和 MESSAGE 模块。这些模块 是由 Net.Data 而不是语言环境来处理的。 但是,一个 PERL 程序可将文本写入标准输出流 并且直接处理输出的 HTML 表。
REXX 语言环境能够解释在 Net.Data 宏的 FUNCTION 模块中指定的内部 REXX 程序, 或执行存储在单独文件中的外部 REXX 程序。对外部 REXX 程序的调用在 FUNCTION 模块中 是由一条语句标识的,例如:
%EXEC{ REXX-program-file-name [optional parameters] %}
REXX 语言环境使用 RexxStart() API 来告诉 REXX 解释器执行指定的文件,然后将 参数(跟在文件名后面)传递到程序,就好象它们是从命令行输入的一样。 对于 REXX 程序,所有的参数都是作为 ARG[1] 接收的。
变量替换只能在 FUNCTION 模块的“可执行语句”节中执行的。但是参数对于所有 REXX 程序 都是可存取的,不管该程序是在一个 FUNCTION 模块内部定义的还是在一个单独的文件外部定义 的。REXX 语言环境使用 REXX 语言处理器的 RexxVariablePool() 函数来与 REXX 程序 共享 Net.Data 变量。这允许 REXX 程序直接处理参数表中定义的 Net.Data 变量。
REXX 程序是作为 REXX 桩变量来存取表格参数的值的。 对于一个 REXX 程序,表格 T 的列标题是 T_N.i,其字段值 是 T_V.i.j。
SQL 语言环境通过 DB2 用来执行 SQL 语句。SQL 语句的结果可在 Net.Data 缺省表格 或在您指定的表格中返回。
Net.Data 支持您有权使用的任何 SQL 语句。当把 Net.Data 作为一个 CGI 应用程序 调用时,可以将每个 HTML 宏连接到一个数据库;并且必须使用 DATABASE 变量 (OS/390 除外)指定数据库名称。如果 DB2 数据库与 Web 服务器在同一机器上,则不需要 其它设置。 否则,根据所使用平台的不同,可以使用“客户应用程序启用程序(CAE)”来 访问远程数据库,或使用“数据库连接服务(DDCS)”来存取远程数据库。 还可以 使用 DataJoiner 来存取其它数据库。利用 DataJoiner 可以对支持它的数据库使用 两阶段的提交操作。
对于使用链接文件的平台,必须在初始化文件中指定 BIND_FILE 变量,如下所示:
BIND_FILE ./DTWSQL.BND;
Sybase 语言环境允许直接与 Sybase 数据通信。需要在服务器上安装 Sybase 公司 的“开放式客户连接(Open Client CONNECT)”。有关的更多细节,请参阅:
http://www.sybase.com/products/entcon/opencc.html
Sybase 语言环境不支持大型对象,例如图象和声音。只有对没有 SELECT 语句的过程支持存储过程。
使用如下函数可调用 Sybase 语言环境:
%function(DTW_SYB) STL1() {
insert into $(table) (int1,int2) values (111,NULL)
%}
System 语言环境支持对某些外部程序的调用, 这些外部程序在 FUNCTION 模块的 EXEC 语句中标识。
语言环境通过将程序名和参数传递到操作系统(由 C 语言的 system() 函数 调用来运行),来解释 EXEC 程序。 这种方法不允许将 Net.Data 变量 直接传递到外部程序,也不允许外部程序直接检索这些变量,就象在 REXX 语言 环境中一样,因此按以下方式处理变量:
System 语言环境程序通过 Net.Data 名称来存取表格参数的值。表格 T 的列标题 是 T_N_i,其字段值是 T_V_i_j。