IBM Books

Net.Data 语言环境指南


使用语言环境

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 提供的语言环境

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 中的 “自述文件”或“程序目录”,以获取有关您使用的语言环境 的详细信息。

表 1. 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 小应用程序语言环境

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

表格名称是 tnamerows 是表格 的行数,cols 是表格的列数。 对于函数调用中指定的每个 唯一表格,生成这对标记。

然后,对于表格中的每列生成一个 PARAM 标记,例如:

<param name = 'DTW_tname_COLUMN_NAME_j' value = "cname" >

表格名称是 tnamej 是列号, cname 是表格的列名。

最后,生成包含每行中值的 PARAM 标记。

<param name = 'DTW_tname_cname_VALUE_k' value = "val" >

表格名称是 tnamecname 是列名, 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");
            }
        }
    }

Java 语言环境

Net.Data 使用 Java 语言环境支持现存的 Java 应用程序。

Net.Data 增强了对“Java 数据库连接(JDBC**)”的支持;本版本通过 JDBC API 支持 用于访问 DB2 的 Java 小应用程序和 Java 方法(或应用程序)。

从以下这些场点可获得 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)”语言环境通过 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 数据进行通信。必须在服务器上 安装 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 语言环境

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 语言环境

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 语言环境

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 数据通信。需要在服务器上安装 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


[ 页的顶部 | 上一页 | 下一页 | 内容表 | 索引 ]