Net.Data はデータ・ソースへのアクセスと、 ビジネス・ロジックを持つアプリケーション・プログラムの実行のための、 言語環境を提供します。 たとえば、SQL 言語環境によって、 SQL ステートメントを DB2 データベース に渡すことが可能になり、 REXX 言語環境によって、REXX プログラムを起動できるようになります。 また、SYSTEM 言語環境を使用することにより、 プログラムを実行したり、 コマンドを発行したりすることができます。
Net.Data を使うことにより、 ユーザー作成の言語環境をプラグイン方式で追加することができます。 ユーザー作成言語環境は、それぞれ Net.Data によって定義された、 標準的なインターフェースのセットをサポートしていなければなりません。さらに、 ダイナミック・リンク・ライブラリー (DLL) 、または共用ライブラリーとして実装されていなければなりません。 Net.Data 提供の言語環境および ユーザー作成の言語環境の作成方法の詳細については、 Net.Data 言語環境解説書 を参照してください。
図 21 では、 Web サーバー、Net.Data、および Net.Data 言語環境間の関連を表示しています。
以下のセクションでは、Net.Data 言語環境と、 それをマクロで使用する方法について解説しています。
Net.Data 提供の言語環境の構成情報については、 言語環境のセットアップ を参照してください。
言語環境を使用した場合のパフォーマンスの向上については、 言語環境の最適化を参照してください。
Net.Data は、アプリケーション用の、 データおよびプログラミング資源へのアクセスを可能にしてくれる、 言語環境を提供します。
Net.Data は次の 2 つの型の言語環境を提供します。
表 8 では、各言語環境を簡単に説明しています。 どのオペレーティング・システムが、 どの言語環境をサポートしているかを知るには、 Net.Data 解説書 のオペレーティング・システムの付録を参照してください。
言語環境 | 環境名 | 説明 |
---|---|---|
フラット・ファイル・インターフェース | DTW_FILE | フラット・ファイル・インターフェース (FFI) は、 データ・ソースとしてのテキスト・ファイルをサポートする関数をサポートしています。 |
IMS Web | HWS_LE | IMS Web 言語環境では、IMS Web を使用して IMS トランザクションを処理依頼し、 Web ブラウザーでそのトランザクションの出力を受け取ることができます。 |
Java アプレット | DTW_APPLET | Java アプレット言語環境では、Net.Data アプリケーションで、 Java アプレットを使用することができます。 applet タグ を生成するには、 applet タグの限定子とアプレットのパラメーター・リストを指定しなければなりません。 |
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 データに直接アクセスすることができます。 |
システム | DTW_SYSTEM |
システム言語環境は、コマンドの実行と外部プログラムの呼び出しをサポートします。
|
Web レジストリー | DTW_WEBREG |
Web レジストリー言語環境は、
アプリケーション関連の永続的記憶域のための関数を提供します。
|
言語環境を呼び出すには、以下のことを行います。
例 :
%FUNCTION(DTW_SQL) custinfo() { select CUSTNAME, CUSTNO from ibmuser.customer %} ... %HTML(REPORT) { @custinfo() %}
言語環境関数にエラーが検出されると、 言語環境はエラー・コードを含む Net.Data の RETURN_CODE 変数を設定します。
以下のリソースを使用して、エラー条件を処理することができます。
Net.Data を実行しているユーザー ID が、 言語環境ステートメントのターゲットが参照できる任意のオブジェクトにアクセスする、 正当な権限を持っていることを、確認してください。 たとえば、SQL 言語環境が SQL ステートメントを実行し、 SQL ステートメントがデータベース・ファイルにアクセスします。 だから、Net.Data を実行するユーザー ID は、 そのデータベース・ファイルを利用する権限を持っている必要があります。
Net.Data が提供するデータ言語環境では、 関係データベースおよび階層データベースからデータにアクセスできます。 また、その他のデータ・ソースには Net.Data のマクロからアクセスできます。 以下のセクションでは、Net.Data が提供するデータ言語環境と、 Net.Data マクロにおけるその使用方法について説明します。
Net.Data は、 関係データ・ソースにアクセスするのに役立つ関係データベース言語環境を提供します。 Net.Data は以下の関係データベース言語環境を提供します。
ODBC 言語環境の使用方法 :
ODBC ドライバーおよびドライバー・マネージャーを用意します。 ODBC ドライバーの資料には、ODBC 環境のインストールとその構成方法が説明されています。
以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認してください。
ENVIRONMENT (DTW_ODBC) DTWODBC ( IN DATABASE, LOGIN, PASSWORD, TRANSACTION_SCOPE, SHOWSQL, ALIGN, START_ROW_NUM, DTW_SET_TOTAL_ROWS)
制約事項
ご使用のデータベースによっては別の制限がある場合があります。 そのような制限があるかどうかを知るには、ご使用のデータベースの資料を参照してください。
Oracle 言語環境では、Oracle データへのネイティブなアクセスが提供されます。 CGI、FastCGI、NSAPI、ISAPI、ICAPI、あるいは GWAPI を使用して、 Net.Data から Oracle のデータベースにアクセスできます。 この言語環境では、Oracle 7.2、7.3、および 8.0 がサポートされています。
Oracle 言語環境の使用方法 :
以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認してください。
ENVIRONMENT (DTW_ORA) DTWORA (IN DATABASE, LOGIN, PASSWORD, TRANSACTION_SCOPE, SHOWSQL, ALIGN, START_ROW_NUM, DTW_SET_TOTAL_ROWS)
重要 : Oracle 言語環境のセットアップ方法については、 Oracle 言語環境のセットアップを参照してください。
制約事項
Oracle 言語環境には、以下の制約事項があります。
LOGON=admin@ora73
SQL 言語環境では、DB2 データベースにアクセスできます。 DB2 へのアクセス時に最適のパフォーマンスを得るには、この言語環境を使用してください。
SQL 言語環境の使用方法 :
以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認してください。
ENVIRONMENT (DTW_SQL) DTWSQL (IN DATABASE, LOGIN, PASSWORD, TRANSACTION_SCOPE, SHOWSQL, ALIGN, START_ROW_NUM, DTW_SET_TOTAL_ROWS)
制約事項 :
インラインのステートメント・ブロックの、SQL ステートメントの最大サイズは 64KB です。 DB2 ユニバーサル・データベースには、以下の制約事項があります。
ご使用のデータベースによっては別の制限がある場合があります。 そのような制限があるかどうかを判別するには、データベースの資料を参照してください。
Sybase 言語環境の使用方法 :
以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認してください。
ENVIRONMENT (DTW_SYB) DTWSYB ( IN DATABASE, LOGIN, PASSWORD, TRANSACTION_SCOPE, SHOWSQL, ALIGN, START_ROW_NUM, DTW_SET_TOTAL_ROWS)
重要 : Sybase 言語環境のセットアップ方法については、 Sybase 言語環境のセットアップを参照してください。
Sybase 言語環境には、以下の制約事項があります。
以下のセクションでは、これらの言語環境の使用方法について説明しています。
挿入、削除、または更新ステートメントを用いてデータベースの内容を変更する場合、 その変更は、データベースが Net.Data からコミット・ステートメントを受け取るまでは永続的なものとはなりません。 エラーが発生すると、Net.Data はデータベースにロールバック・ステートメントを送り、 前回のコミットからの修正をすべてリバースにします。
Net.Data によるコミットおよび場合によってはロールバックの送信は、 TRANSACTION_SCOPE の設定方法、およびマクロにコミットが明示的に指定されたいるかどうかにより異なります。 TRANSACTION_SCOPE の値は MULTIPLE および SINGLE です。
コミットおよび場合によってはロールバック・ステートメントが発行される前に、Net.Data がすべての SQL ステートメントを実行するかを指定します。 Net.Data は要求の最後にコミットを送信し、 各 SQL ステートメントが正常に発行されると、 コミットによりデータベースのすべての変更が永続的なものとなります。 ステートメントのいずれかがエラーを戻すと、Net.Data はロールバック・ステートメントを発行し、 データベースの設定は元の状態に戻ります。TRANSACTION_SCOPE が設定されていなければ、 MULTIPLE がデフォルトです。
このコミット・メソッドを活動化するには、TRANSACTION_SCOPE を MULTIPLE に設定します。
たとえば、以下のような場合です。
@DTW_ASSIGN(TRANSACTION_SCOPE,"MULTIPLE")
各 SQL ステートメントが正常に終了した後に Net.Data がコミット・ステートメントを発行するよう指定します。 SQL ステートメントがエラーを戻すと、ロールバック・ステートメントが発行されます。 単一トランザクション効力範囲によりデータベースの即時変更が確実となりますが、 この効力範囲では後でロールバック・ステートメントを使用して変更を取り消すことはできません。
このコミット・メソッドを活動化するには、TRANSACTION_SCOPE を SINGLE に設定します。 たとえば、以下のような場合です。
@DTW_ASSIGN(TRANSACTION_SCOPE,"SINGLE")
コミット・ステートメントは、COMMIT SQL ステートメントを使用することによりマクロ内の任意の SQL ステートメントの最後で発行することができます。 アプリケーション開発者は、TRANSACTION_SCOPE の設定を MULTIPLE にして、トランザクションとみなしたステートメント・グループの最後にコミット・ステートメントを発行することにより、 アプリケーションにおけるコミットおよびロールバックの振る舞いを完全に管理することができます。たとえば、マクロ中のそれぞれの更新の後にコミット・ステートメントを発行することにより、 データの保全性が保証できます。
SQL コミット・ステートメントを発行するには、 HTML ブロックの任意のポイントに呼び出し可能な関数を定義します。
%FUNCTION(DTW_SQL) user_commit() { commit %} .. %HTML { ... @user_commit() ... %}
ラージ・オブジェクト・ファイル (LOB) を DB2 データベースに保管し、 ユーザーの Web アプリケーションの SQL または ODBC 言語環境を使用してそれらのファイルにアクセスすることができます。
SQL または ODBC 言語環境では、 SQL 照会が結果セットで LOB を戻す場合は、 変数 (V1 または V2 など) を処理する Net.Data 表または Net.Data 表フィールドに、 ラージ・オブジェクトを保管しません。 代わりに、Net.Data に LOB がある場合は、in Net.Data で作成されるファイルにその LOB を保管します。 このファイルは、HTML_PATH パス構成変数で指定されるディレクトリーにあります。 変数を処理する Net.Data 表フィールドおよび表の値は、 そのファイルのパスに設定されます。 そのファイルにアクセスできるのは、 Net.Data を実行しているユーザー ID に限定されます。
LOB を保管するファイルの名前は動的に構成され、 その形式は以下のようになります。
name[.extension]
変数:
BLOB のオブジェクトの型が認識されないと、ファイル名には拡張子が付加されません。
LOB がマクロ・ファイル内で参照されている場合、 SQL 言語環境では、以下の構文を使用して、 LOB ファイル名の前に /tmplobs/ のストリングが付いたファイル名を戻します。
/tmplobs/name.[extension]
計画のためのヒント : 照会が LOB を戻すと、 HTML_PATH パス構成変数で指定されたディレクトリーにファイルが作成されます。 LOB を使用する場合、リソースがすぐに消費されるため、システムの制限を考慮してください。 定期的にディレクトリーを整理するバッチ・プログラムを作成するか 、 あるいは dtwclean デーモンを実行しても構いません。 詳しくは、一時的 LOBS の管理 を参照してください。 DataLinks を使用することをお勧めします。 これによって、SQL 言語環境でディレクトリーにファイルを保管する必要性がなくなり、 パフォーマンスが向上して、システム資源の使用量が少なくなります。
例: アプリケーションでは MPEG オーディオ (.MPA) ファイルを使用するため、 アプリケーション・ユーザーはファイル名をクリックしてビューアーを起動する必要があります。 SQL 言語環境ではこのファイル型を認識しないため、 EXEC 変数を使用してファイルに拡張子を追加します。
%DEFINE{ docroot="/usr/lpp/internet/server_root/html" myFile=%EXEC "rename $(docroot)$(V3) $(docroot)$(V3).mpa" %} %{ where rename is the rename command on your operating system %} %FUNCTION(DTW_SQL) queryData() { SELECT Name, IDPhoto, Voice FROM RepProfile %REPORT{ <P>Here is the information you selected:<P> %ROW{ $(myFile) $(V1) Voice sample <IMG SRC="$(V2)"> <A HREF="$(V3).mpa")>Voice sample</A><P> %} %} %} %HTML(REPORT) { @queryData() %}
queryData 関数は以下の HTML 出力を戻します。
<P>Here are the images you selected:<P> Kinson Yamamoto <IMG SRC="/tmplobs/p2345n1.gif"> <A HREF="/tmplobs/p2345n2.mpa">Voice sample</A><P> Merilee Lau <IMG SRC="/tmplobs/p2345n3.gif"> <A HREF="/tmplobs/p2345n4.mpa">Voice sample</A><P>
前述の例の REPORT ブロックでは、暗黙のテーブル変数 V1、V2、および V3 を使用しています。
LOB のためのアクセス権 : LOB 用のデフォルトの tmplobs ディレクトリーは、 出荷された Net.Data 初期設定ファイルの HTML_PATH で指定されたディレクトリーにあります。 どんなユーザー ID でも、アクセス可能です。 HTML_PATH 値が変更されている場合は、 Web サーバーが実行されているユーザー ID が、 HTML_PATH で指定されたディレクトリーに書き込みアクセスできることを確認してください (詳しくは、HTML_PATH を参照してください)。
一時的 LOB の管理
Net.Data は、HTML_PATH パス構成変数で指定されたディレクトリーの下にある、 tmplobs というサブディレクトリーに一時的 LOB を保管します。 これらのファイルは大きくても構いませんが、 定期的に整理し、受け入れ可能なパフォーマンスを保守する必要があります。
Net.Data には、dtwclean というデーモンが備えられています。 これは、tmplobs ディレクトリーを定期的に管理する際に役立ちます。 dtwclean は、ポート 7127 を使用します。
dtwcleanデーモンを実行するには、以下のようにします。 コマンド行ウィンドウで、以下のコマンドを入力します。
dtwclean [-t xx] [-d|-l]
変数:
ストアード・プロシージャーは DB2 に保管されたコンパイル済みのプログラムで、 SQL ステートメントを実行することができます。Net.Data では、ストアード・プロシージャーは、 CALL ステートメントを使用して、Net.Data の関数から呼び出されます。ストアード・プロシージャーのパラメーターは、 Net.Data の関数仮引き数リストから渡されます。ストアード・プロシージャーを使用すると、 コンパイル済みの SQL ステートメントを、データベース・サーバーと一緒に保管することにより、 パフォーマンスと保全性を改良することができます。Net.Data は、 SQL および ODBC 言語環境での DB2 によるストアード・プロシージャー使用をサポートします。
このセクションでは、以下のトピックについて説明します。
ストアード・プロシージャーの構文は FUNCTION ステートメント、CALL ステートメント、 および REPORT ブロック (任意選択) を使用します。
%FUNCTION (DTW_SQL) function_name ([IN datatype arg1, INOUT datatype arg2, OUT tablename, ...]) { CALL stored_procedure [(resultsetname, ...)] [%REPORT [(resultsetname)] { %}] .. [%REPORT [(resultsetname)] { %}] [%MESSAGE %}] %}
変数:
BIGINT | DOUBLEPRECISION | SMALLINT |
CHAR | FLOAT | TIME |
DATE | INTEGER | TIMESTAMP |
DECIMAL | GRAPHIC | VARCHAR |
DOUBLE | LONGVARCHAR | VARGRAPHIC |
| LONGVARGRAPHIC |
|
|
|
|
%FUNCTION (DTW_SQL) function_name()
%FUNCTION (DTW_SQL) function_name (IN datatype arg1, INOUT datatype arg2, OUT tablename...)
CALL stored_procedure
%REPORT (resultsetname) { .. %}
例 :
%FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) arg1) { CALL myproc %REPORT (mytable){ ... %ROW { ... %} ... %} %}
CALL stored_procedure (resultsetname1, resultsetname2, ...)
%REPORT(resultsetname1) { .. %}
例 :
%FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) arg1, OUT table1) { CALL myproc (table1, table2) %REPORT(table2) { ... %ROW { ... %} ... %} %}
ストアード・プロシージャーにパラメーターを渡すことができます。 また、ストアード・プロシージャーがパラメーターを更新するようにして、 新規値が Net.Data マクロに渡されるようにできます。関数仮引き数リストのパラメーターの数および型は、 ストアード・プロシージャーに定義した数および型に一致する必要があります。 たとえば、ストアード・プロシージャーに定義したパラメーター・リストのパラメーターが INOUT の場合、関数仮引き数リストにある対応パラメーターは INOUT でなくてはなりません。 ストアード・プロシージャーに定義したリストのパラメーターが CHAR(30) 型の場合、 関数仮引き数リストの対応パラメーターは CHAR(30) でなくてはなりません。
例 1: ストアード・プロシージャーにパラメーター値を渡す
%FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) valuein) { CALL myproc ..
例 2: ストアード・プロシージャーから値を戻す
%FUNCTION (DTW_SQL) mystoredproc (OUT VARCHAR(9) retvalue) { CALL myproc ..
SQL または ODBC 言語環境を使用することによりストアード・プロシージャーから 1 つ以上の結果セットを戻すことができます。 結果セットは、Net.Data テーブルに保管してさらにマクロで処理をするか、 または REPORT ブロックを使用して処理することができます。ストアード・プロシージャーが複数の結果セットを生成する場合、 ストアード・プロシージャーの生成した結果セットにそれぞれ名前を関連付ける必要があります。 これは、CALL ステートメントにパラメーターを指定して行います。 結果セットに指定する名前を REPORT ブロックまたは Net.Data 表と関連付け、 Net.Data が各結果セットを処理する方法を決めることができます。 以下を行うことができます。
複数のレポート・ブロックを使用する場合は、複数の REPORT ブロックに関するガイドラインおよび制約事項のガイドラインおよび制限を参照してください。
単一の結果セットを戻してデフォルトのレポートを使用する
以下の構文を使用します。
%FUNCTION (DTW_SQL) function_name () { CALL stored_procedure %}
たとえば、以下のような場合です。
%FUNCTION (DTW_SQL) mystoredproc () { CALL myproc %}
単一の結果セットを戻して REPORT ブロックを指定する
以下の構文を使用します。
%FUNCTION (DTW_SQL) function_name () { CALL stored_procedure [(resultsetname)] %REPORT [(resultsetname)] { ... %} %}
たとえば、以下のような場合です。
%FUNCTION (DTW_SQL) mystoredproc () { CALL myproc %REPORT { ... %ROW { ... %} ... %} %}
代わりに、以下の構文を使用することもできます。
%FUNCTION (DTW_SQL) function_name () { CALL stored_procedure (resultsetname) %REPORT (resultsetname) { ... %} %}
たとえば、以下のような場合です。
%FUNCTION (DTW_SQL) mystoredproc () { CALL myproc (mytable1) %REPORT (mytable1) { ... %ROW { ... %} ... %} %}
処理を続行するために、 Net.Data 表に単一の結果セットを保管するには、以下のようにします。
以下の構文を使用します。
%FUNCTION (DTW_SQL) function_name (OUT tablename) { CALL stored_procedure (resultsetname) %}
たとえば、以下のような場合です。
%DEFINE DTW_DEFAULT_REPORT = "NO" %FUNCTION (DTW_SQL) mystoredproc (OUT mytable1) { CALL myproc (mytable1) %}
DTW_DEFAULT_REPORT が NO に設定され、 デフォルトのレポートが結果セットのために生成されないことに注意してください。
複数の結果セットを戻し、 それをデフォルトのレポート形式設定を使用して表示するには、以下のようにします。
以下の構文を使用します。
%FUNCTION (DTW_SQL) function_name () { CALL stored_procedure [(resultsetname1, resultsetname2, ...)] %}
ただし、レポート・ブロックは指定されていません。
たとえば、以下のような場合です。
%DEFINE DTW_DEFAULT_REPORT = "YES" %FUNCTION (DTW_SQL) mystoredproc () { CALL myproc %}
複数の結果セットを戻し、 処理を続行するために Net.Data 表にその結果セットを保管するようにするには、 以下のようにします。
以下の構文を使用します。
%FUNCTION (DTW_SQL) function_name (OUT tablename1, tablename2, ...) { CALL stored_procedure (resultsetname1, resultsetname2, ...) %}
たとえば、以下のような場合です。
%DEFINE DTW_DEFAULT_REPORT = "NO" %FUNCTION (DTW_SQL) mystoredproc (OUT mytable1, mytable2) { CALL myproc (mytable1, mytable2) %}
DTW_DEFAULT_REPORT が NO に設定され、 デフォルトのレポートが結果セットのために生成されないことに注意してください。
複数の結果セットを戻し、 表示処理のために REPORT ブロックを指定するには、以下のようにします。
それぞれの結果セットは、1 つまたは複数の REPORT ブロックに関連付けられています。以下の構文を使用します。
%FUNCTION (DTW_SQL) function_name (, ...) { CALL stored_procedure (resultsetname1, resultsetname2, ...) %REPORT (tablename1) ... %ROW { ... %} ... %} %REPORT (tablename2) ... %ROW { ... %} ... %} .. %}
たとえば、以下のような場合です。
%FUNCTION (DTW_SQL) mystoredproc () { CALL myproc (mytable1, mytable2) %REPORT(mytable1) { ... %ROW { ... %} ... %} %REPORT(mytable2) { ... %ROW { ... %} ... %} %}
複数の結果セットを戻し、 各結果セットに異なる表示または処理オプションを指定するには、以下のようにします。
固有のパラメーター名を使用して、 各結果セットに異なる処理オプションを指定することができます。 たとえば、以下のような場合です。
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable2) { CALL myproc (mytable1, mytable2, mytable3) %REPORT(mytable1) ... %ROW { ... %} ... %} %}結果セット mytable1 は、 対応する REPORT ブロックにより処理され、 マクロ書き込みプロセスの指定どおりに表示されます。 結果セット mytable2 は、Net.Data 表 mytable2 に保管され、 ほかの関数に渡すなどの処理を続行するために使用することができます。 結果セット mytable3 は、 Net.Data のデフォルトのレポート形式設定を使用して表示することができます。 これは、この結果セットに対して、REPORT ブロックを指定しなかったからです。
DataLink データ型は、データベース・ファイルに保管できるデータの型を拡張するための、 基本作成ブロックです。 DataLink の場合、列に保管される実際のデータは、ファイルを指すポインターだけです。 このファイルは、イメージ・ファイル、音声記録方式、 またはテキスト・ファイルのいずれの型のファイルでも構いません。 DataLinks は URL を保管して、ファイルのロケーションを解決します。
DATALINK データ型については、DataLink ファイル・マネージャーを使用する必要があります。 DataLink ファイル・マネージャーの詳細については、 使用しているオペレーティング・システムの DataLinks の資料を参照してください。 DATALINK データ型を使用する前に、 Web サーバーが、 DB2 ファイル・マネージャー・サーバーの管理するファイル・システムにアクセスできることを確認します。
SQL 照会が DataLinks を使って結果セットを戻し、 その DataLink 列が、 READ PERMISSION DB DataLink オプションをもつ FILE LINK CONTROL を使って作成されている場合は、 DataLink 列のファイル・パスにはアクセス・トークンが含まれています。 DB2 はそのアクセス・トークンを使用して、ファイルへのアクセスを認証します。 このアクセス・トークンがない場合は、 ファイルにアクセスしようとしても、権限違反のために、すべて失敗します。 ただし、アクセス・トークンには、 ブラウザーに戻される URL では使用できない文字 (セミコロン (;) 文字など) が組み込まれている可能性があります。 たとえば、以下のような場合です。
/datalink/pics/UN1B;0YPVKGG346KEBE;baibien.jpg
URL にはセミコロン (;) が含まれているため、これは無効です。 有効な URL にするには、Net.Data の組み込み関数 DTW_URLESCSEQ を使用してセミコロンをエンコードしなくてはなりません。ただし、 この関数は (/) もエンコードするため、関数を適用する前に行う必要のあるストリング処理もあります。
Net.Data MACRO_FUNCTION を記述してストリング処理を自動化し、 DTW_URLESCSEQ 関数を使用することができます。 DATALINK データ型の列からデータを検索するマクロについてそれぞれこの方法を用います。
例 1: DB2 UDB から戻された URL のエンコードを自動化する MACRO_FUNCTION
%{ TO DO: Apply DTW_URLESCSEQ to a DATALINK URL to make it a valid URL. IN: DATALINK URL from DB2 File Manager column. RETURN: The URL with token portion is URL encoded %} %MACRO_FUNCTION encodeDataLink(in DLURL) { @DTW_rCONCAT( @DTW_rDELSTR( DLURL, @DTW_rADD(@DTW_rLASTPOS("/", DLURL), "1" ) ), @DTW_rURLESCSEQ( @DTW_rSUBSTR(DLURL, @DTW_rADD( @DTW_rLASTPOS("/", DLURL), "1" ) ) ) ) %}
この MACRO_FUNCTION を使用すると、URL は正しくエンコードされ、 DATALINK 列に指定されたファイルはいずれの Web ブラウザーにおいても参照可能となります。
例 2: DATALINK URL を戻す SQL 照会を指定する Net.Data マクロ
%FUNCTION(DTW_SQL) myQuery() { select name, DLURLCOMPLETE(picture) from myTable where name like '%river%' %REPORT{ %ROW{ <p> $(V1) <br> Before Encoding: $(V2) <br> After Encoding: @encodeDataLInk($(V2)) <br> Make HREF: <a href="@encodeDataLink($(V2))"> click here </a> <br> <p> %} %} %}
DataLink ファイル・マネージャーの関数が使用されることに注意してください。関数 dlurlcomplete は完全な URL を戻します。
以下の例では、 マクロから関係データベース言語環境を呼び出す方法を示しています。
次の例は、ODBC 言語環境に対して複数の関数を定義し、それらを呼び出しています。
%DEFINE { DATABASE="qesq1" SHOWSQL="YES" table="int_null" LOGIN="netdata1" PASSWORD="ibmdb2"%} %function(dtw_odbc) sq1() { create table int_null (int1 int, int2 int) %} %function(dtw_odbc) sql2() { insert into $(table) (int1) values (111) %} %function(dtw_odbc) sql3() { insert into $(table) (int2) values (222) %} %function(dtw_odbc) sql4() { select * from $(table) %} %function(dtw_odbc) sql5() { drop table $(table) %} %HTML(REPORT) { @sql1() @sql2() @sql3() @sql4() %}
%DEFINE { LOGIN="ulogin" PASSWORD="upassword" DATABASE="udatabase" table= "utable" %} %FUNCTION(DTW_ORA) myQuery(){ select ename,job,empno,hiredate,sal,deptno from $(table) order by ename %} %MESSAGE{ 100 : "<b>WARNING</b>: No employee were found that met your search criteria.<p>" : continue %} %HTML(REPORT) { @myQuery() %}
以下の例は、DTW_SQL 関数定義を持つ、 SQL ストアード・プロシージャーを呼び出すマクロを示しています。 この例は、データ型が異なる 3 つのパラメーターを持っています。 DTW_SQL 言語環境は各パラメーターを、 そのデータ型に従ってストアード・プロシージャーに渡します。 ストアード・プロシージャーが処理を完了すると、出力パラメーターが戻され、 Net.Data はそれに応じて変数を更新します。
%{*********************************************************** DEFINE BLOCK ************************************************************%} %DEFINE { MACRO_NAME = "TEST ALL TYPES" DTW_HTML_TABLE = "YES" Procedure = "TESTTYPE" parm1 = "1" %{SMALLINT %} parm2 = "11" %{INT %} parm3 = "1.1" %{DECIMAL (2,1) %} %} %FUNCTION(DTW_SQL) myProc (INOUT SMALLINT parm1, INOUT INT parm2, INOUT DECIMAL(2,1) parm3){ CALL $(Procedure) %} %HTML(REPORT) { <HEAD> <TITLE>Net.Data : SQL Stored Procedure: Example '$(MACRO_NAME)'. </TITLE> </HEAD> <BODY BGCOLOR="#BBFFFF" TEXT="#000000" LINK="#000000"> <p><p> Calling the function to create the stored procedure. <p><p> @CRTPROC() < hr> <h2> Values of the INOUT parameters prior to calling the stored procedure:<p> </h2> <b>parm1 (SMALLINT)</b><br> $(parm1)<p> <b>parm2 (INT)</b><br> $(parm2)<p> <b>parm3 (DECIMAL)</b><br> $(parm3)<p> <p> < hr> <h2> Calling the function that executes the stored procedure. </h2> <p><p> @myProc(parm1,parm2,parm3) < hr> <h2> Values of the INOUT parameters after calling the stored procedure:<p> </h2> <b>parm1 (SMALLINT)</b><br> $(parm1)<p> <b>parm2 (INT)</b><br> $(parm2)<p> <b>parm3 (DECIMAL)</b><br> $(parm3)<p> </body> %}
%DEFINE { LOGIN="ulogin" PASSWORD="upassword" DATABASE="udatabase" table= "utable" %} %FUNCTION(DTW_SYB) myQuery(){ select ename,job,empno,hiredate,sal,deptno from $(table) order by ename %} %MESSAGE{ 100 : "<b>WARNING</b>: No employee were found that met your search criteria.<p>" : continue %} %HTML(REPORT) { @myQuery() %}
データ・ソースとしてフラット・ファイル (すなわち平文ファイル) を使用する場合は、 フラット・ファイル・インターフェース (FFI) と、 それに関連付けられている Web サーバー上のファイルを、オープン、クローズ、 読み取り、書き込み、そして削除するための関数を使用します。 ファイル言語サポートは、ブラウザーから Web クライアントの要求が発生すると、 FFI 関数を使用して Web サーバー上のファイルに対して読み取り、 または書き込みを行います。 FFI はファイルをレコード・ファイルとして表示します。 レコードは Net.Data マクロ表変数の行と等価であり、レコードの値は、 Net.Data マクロ表変数のフィールドの値と等価です。 FFI はファイルからレコードを Net.Data マクロ表の行に読み込み、 行を表からレコードに書き込みます。
FFI 組み込み関数の説明と構文については、 Net.Data 解説書 を参照してください。
以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認します。
ENVIRONMENT (DTW_FILE) DTWFILE ( OUT RETURN_CODE )
Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。
FFI 関数の呼び出しは、他の関数の呼び出しと同じです。 DEFINE ステートメントを使用して、渡したいパラメーターを変数として定義します。 たとえば次のように定義します。
%DEFINE { myFile = "c:/private/myfile" myTable = %TABLE myWait = "1500" myRows = "2" %}
次に関数呼び出しステートメントを使用して関数を呼び出します。 たとえば次のようにします。
@DTWF_UPDATE(myFile, "Delimited", "|", myTable, myWait, myRows)
この例では、Net.Data はffi001.dat の内容を Net.Data の表に読み込み、 この表の内容を tmp.dat ファイルに書き込みます。 最後に、Net.Data は tmp.dat ファイルを削除します。
%DEFINE { mytable = %TABLE(ALL) myfile = "/usr/lpp/netdata/ffi//ffi001.dat" tmpfile = "/usr/lpp/netdata/ffi/tmp.dat" %} %HTML(report){ @DTWF_READ(myfile, "ASCIITEXT", " ", mytable) @DTW_TB_TABLE(mytable) @DTWF_WRITE(tmpfile, "ASCIITEXT", " ", mytable) @DTW_TB_TABLE(mytable) @DTWF_REMOVE(tmpfile) %}
Net.Data の Web レジストリーは、 アプリケーションに関連するデータ用の永続的な記憶域を提供します。 Web レジスターには、 実行時に Web ベースのアプリケーションが動的にアクセスできる構成情報、 およびその他のデータが保管されます。 Web レジストリーには、 Net.Data と Web レジストリーの組み込みサポートを使用する Net.Data マクロを介するか、 この目的のために作成された CGI プログラムからしかアクセスできません。 Web レジストリーは、オペレーティング・システムのサブセットで使用できます。 Web レジストリーの組み込み関数の説明と構文、 およびこの言語環境をサポートするオペレーティング・システムのリストについては、 Net.Data 解説書 を参照してください。
標準的な Web ページの開発では、 URL は直接 Web ページの HTML ソースに挿入しなければなりません。 このため、リンクの変更が難しくなります。 また、静的な性格のため、Web ページに簡単に挿入できるリンクのタイプも制限されます。 Web レジストリーを使用して、 アプリケーションに関連するデータ (たとえば URL) を保管しておけば、 動的に設定されたリンクを持つ HTML のページを作成するのに役に立ちます。
レジストリーへの情報の保管およびその保守は、 レジストリーへの書き込みアクセス権を持つアプリケーション開発者、 あるいは Web 管理者が行うことができます。 アプリケーションは、それに関連付けられているレジストリーから実行時に情報を取得します。 これにより、柔軟なアプリケーションを設計でき、 アプリケーションとサーバーの移動も可能になります。 Net.Data のマクロを使用すると、 動的に設定されたリンクを持つ HTML のページを作成できます。
情報は Web レジストリーにレジストリー項目の形で保管されます。 各レジストリー項目は、RegistryVariable ストリングと、 それに対応する RegistryData ストリングという、ペアの文字ストリングで構成されます。 ペアのストリングで表示できる情報はすべて、レジストリー項目として保管できます。 Net.Data は、この変数ストリングを、レジストリーの特定の項目を見つけ、 取得するための検索キーとして使用します。
表 10 は、Web レジストリーのサンプルを表示したものです。
CompanyName | WorldConnect |
---|---|
Server | ftp.einet.net |
JohnDoe/foreground | Green |
CompanyURL/IBM Corp. | http://www.ibm.com |
CompanyURL/Sun Microsystems Corp. | http://www.sun.com |
CompanyURL/Digital Equipment Corp. | http://www.dec.com |
JaneDoe/Home_page | http://jane.info.net |
Web レジストリーの使用を考慮すべき理由 :
Web レジストリーの索引付け項目は、 Index ストリングが付加された RegistryVariable ストリングを持つ項目で、 次の構文を使用します。
RegistryVariable/Index
ユーザーは、個々のパラメーターの索引ストリングの値を、 索引付け項目を操作するように設計された組み込み関数に与えます。 複数の索引付けレジストリー項目は、 同じ RegistryVariable ストリング値を持つことができますが、 異なる Index ストリング値を持つことにより、各項目を一意的に識別することができます。
Smith/Company_URL | http://www.ibmlink.ibm.com |
Smith/Home_page | http://www.advantis.com |
上の 2 つの索引付け項目は、 同じ Smith という RegistryVariable ストリング値を持っていますが、 それぞれ異なる Index ストリングを持っています。 これらの項目は、Web レジストリー関数では異なる 2 つの項目として処理されます。
以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認します。
ENVIRONMENT (DTW_WEBREG) DTWWEB ( OUT RETURN_CODE )
Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。
Web レジストリー関数を、他の関数を呼び出すのと同じように呼び出します。 DEFINE ステートメントを使用して、渡したいパラメーターを変数として定義します。 例 :
%DEFINE { name = "smith" %}
次に関数呼び出しステートメントを使用して関数を呼び出します。 たとえば次のようにします。
@DTWR_ADDENTRY("URLLIST", name, "http://www.software.ibm.com/", "WORK_URL"
次の例では Web レジストリーを作成し、記入項目を追加しています。 その後、記入項目を含むレポートを表示します。
%DEFINE { RegTable = %TABLE(ALL) %} %MESSAGE { default:"<p>Function Error: Return code: $(RETURN_CODE)." :continue %} %FUNCTION(DTW_WEBREG) ListTable(INOUT RegTable) { %} %HTML(report){ @DTWR_CREATEREG("MYREG") @DTWR_ADDENTRY("MYREG", "Dept. 1", "Payroll") @DTWR_ADDENTRY("MYREG", "Dept. 2", "Technical Support") @DTWR_ADDENTRY("MYREG", "Dept. 3", "Research") @DTWR_LISTREG("MYREG", RegTable) <p>Report:<br> @ListTable(RegTable) %}
IMS Web 言語環境は、Net.Data を使用して、 WWW 環境で IMS トランザクションを実行するための完全な終端間解決のパーツです。 IMS Web 言語環境は、以下を提供します。
IMS Web Studio ツールは、DLL およびマクロのためのコードと、 DLL 実行可能ファイル、 または共有ライブラリーを構築するための作成ファイルを、 トランザクションのメッセージ形式サービス (MFS) のソース、 および IMS Web の Net.Data アプリケーションのための HTML ページのサンプルから、 生成します。 実行可能な形式の DLL を構築後、ユーザーはその DLL とマクロを、 Net.Data を実行している Web サーバーに移動します。 トランザクションは、Web 環境で作動可能になります。
IMS Web は、Web サーバーと IMS 環境との間で通信を行うために、 IMS TCP/IP オープン・トランザクション・マネージャー・アクセス (OTMA) 接続を使用します。
IMS Web の使い方の詳細は、IMS Web のホーム・ページを参照してください。
http://www.software.ibm.com/data/ims/about/imsweb/document/
IMS Web 言語環境を使用するには、Net.Data 初期設定ファイルを検査し、 言語環境をセットアップしなければなりません。
以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認してください。
ENVIRONMENT (HWS_LE) DTWHWS ( OUT RETURN_CODE )
Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。
重要 : IMS 言語環境のセットアップ方法については、 IMS Web 言語環境のセットアップを参照してください。
Net.Data の Web 言語環境は、 Net.Data が CGI アプリケーションとして実行される場合しかサポートされません。
Net.Data は、外部プログラムを呼び出す際に使用するための、 以下の言語環境を提供しています。
アクセス権 : Net.Data を実行するときのユーザー ID が、 プログラムがアクセスする可能性のあるオブジェクトを含めて、 プログラムを実行するためのアクセス権を持っていることを確認してください。 詳しくは、Net.Data がアクセスするファイルへのアクセス権の授与を参照してください。
Java アプレット言語環境では、Net.Data アプリケーションに、 Java アプレット用の HTML タグを簡単に生成することができます。 Java アプレット言語環境を呼び出す際に、アプレット名を指定し、 そのアプレットが必要とするパラメーターを渡します。 Java アプレット言語環境は、マクロを処理し、HTML アプレット・タグを生成します。 Web ブラウザーはこのタグを使用して、アプレットを実行します。
さらにNet.Data は、アプレットが表パラメーターにアクセスするのに使用可能な、 インターフェースのセットを提供します。 これらのインターフェースは DTW_Applet.class というクラスに含まれています。
以下のセクションでは、Java アプレット言語環境を使用して、 Java アプレットを実行する方法について説明しています。
以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認します。
ENVIRONMENT (DTW_APPLET) DTWJAVA ( OUT RETURN_CODE )
Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。
Net.Data の Java アプレット言語環境を使用する前に、どのアプレットを使用するのか、 あるいはどのアプレットを作成する必要があるのかを決定する必要があります。 アプレットの作成の詳細については、Java の資料を参照してください。
アプレット言語環境は、Net.Data の関数呼び出しを使って呼び出します。 関数呼び出しには宣言は不要です。 関数呼び出しの構文を以下に示します。
@DTWA_AppletName(parm1, parm2, ..., parmN)
アプレット・タグを生成するマクロの作成方法 :
%define{ DATABASE = "celdial" <=Net.Data variable: name of the database MyGraph.codebase = "/netdata-java/" <=Required applet attribute MyGraph.height = "200" <=Required applet attribute MyGraph.width = "400" <=Required applet attribute MyTitle = "This is my Title" <=Net.Data variable: name of the Web page MyTable = %TABLE(all) <=Table to store query results %}
%FUNCTION(DTW_SQL) mySQL(OUT table){ select name, ages from ibmuser.guests %}
例 :
%HTML(report){ <=The start of the HTML block @mySQL(MyTable) <=A call to the SQL function mySQL @DTWA_MyGraph(MyTitle, DTW_COLUMN(ages) MyTable) <=Applet function call %}
アプレット・タグの属性は Net.Data マクロの任意の位置に指定できます。 Net.Data は、 AppletName.attribute という形式を持つすべての変数を、 属性としてアプレット・タグに置き換えます。 属性をアプレット・タグに定義するための構文を以下に示します。
%define AppletName.attribute = "value"
以下に示した属性はすべてのアプレットで必須です。
以下の属性はオプションです。
たとえば、MyGraph という名前のアプレットに対しては、 これら必須の属性を以下のように定義できます。
%DEFINE{ MyGraph.codebase = "/netdata-java/" MyGraph.height = "200" MyGraph.width = "400" %}
実際の指定は DEFINE セクションにある必要はありません。 値は DTW_ASSIGN 関数で設定できます。 AppletName.code 変数に変数を定義しない場合は、 Net.Data はデフォルトの code パラメーターを、 アプレット・タグに追加します。 code パラメーターの値は AppletName.class です。 ここで、AppletName はアプレットの名前です。
関数呼び出しの際に Java アプレット言語環境に渡すパラメーターのリストを定義します。 以下を含むパラメーターを渡すことができます。
パラメーターを渡すと、Net.Data は、 パラメーターに割り当てた名前と値を持つ Java アプレットの PARAM タグを、 HTML 出力に作成します。 文字列リテラルまたは関数呼び出しの結果は渡すことができません。
Net.Data 変数はパラメーターとして使用することができます。 変数をマクロの DEFINE ブロックで定義し、 その変数の値を DTWA_AppletName 関数呼び出しで渡すと、 Net.Data は、その変数と同じ名前と値を持つ PARAM タグを生成します。 たとえば、次のマクロ・ステートメントが与えられたとします。
%define{ ... MyTitle = "This is my Title" %} %HTML(report){ @DTWA_MyGraph( MyTitle, ...) %}
Net.Data は次のアプレット・タグ PARAM を作成します。
<param name = 'MyTitle' value = "This is my Title" >
Net.Data は、Java アプレット言語環境が呼び出されるたびに、 DTW_NUMBER_OF_TABLES という名前の PARAM タグを生成し、 関数呼び出しが何らかの表変数を渡したかどうかを指定します。 値は Net.Data が関数で使用する表変数の数です。 関数呼び出しに表変数が指定されていない場合は、以下のタグが生成されます。
<param name = "DTW_NUMBER_OF_TABLES" value = "0" >
関数呼び出しでは、1 つ以上の Net.Data の表変数を渡すことができます。 Net.Data の表変数を DTWA_AppletName 関数呼び出しで指定すると、 Net.Data は以下の 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 は対応する行と列の値に一致する値です。
表列を関数呼び出し時にパラメーターとして渡すことにより、 特定の列のタグを生成することができます。 Net.Data は、指定された列に対してのみ対応するアプレット・タグを生成します。 表列パラメーターは次の構文を使用します。
@DTWA_AppletName(DTW_COLUMN( x )Table)
ここで、x は表の列の名前または番号です。
表列パラメーターは、表パラメーターに対して定義された同じアプレット・タグを使用します。
変数 DTW_APPLET_ALTTEXT は、Java をサポートしていないブラウザー、 あるいは Java のサポートをオフにしているブラウザーに表示するテキストを指定します。 たとえば、次の変数定義
%define DTW_APPLET_ALTTEXT = "<P>Sorry, your browser is not Java-enabled."
は、以下の HTML タグとテキストを作成します。
<P>Sorry, your browser is not Java-enabled.<BR>
この変数が定義されていない場合は、代替テキストは表示されません。
次の例は、Java アプレット言語環境を呼び出す Net.Data マクロと、 呼び出された Java アプレット言語環境によって生成されたアプレット・タグを示しています。
Net.Data マクロには、Java アプレット言語環境への次の関数呼び出しが含まれています。
%define{ DATABASE = "celdial" DTW_APPLET_ALTTEXT = "<P>Sorry, your browser is not Java-enabled." DTW_DEFAULT_REPORT = "no" MyGraph.codebase = "/netdata-java/" MyGraph.height = "200" MyGraph.width = "400" MyTitle = "This is my Title" %} %FUNCTION(DTW_SQL) mySQL(OUT table){ select name, ages from ibmuser.guests %} %HTML(report){ @mySQL(MyTable) @DTWA_MyGraph(MyTitle, DTW_COLUMN(ages) MyTable) %}
DEFINE セクションの Net.Data マクロの行は、アプレット・タブの属性を指定しています。
MyGraph.codebase = "/netdata-java/" MyGraph.height = "200" MyGraph.width = "400"
この言語環境は、次の限定子を持つアプレットを生成します。
<applet code = 'MyGraph.class' codebase = '/netdata-java/' width = '400' height = '200' >
Net.Data は、Net.Data マクロの SQL セクションから、 SQL 照会結果を出力表 MyTable に戻します。 この表は次のように DEFINE セクションで指定されています。
MyTable = %TABLE(all)
マクロでのアプレットの呼び出しは、次のように HTML セクションで指定されます。
@DTWA_MyGraph(MyTitle, DTW_COLUMN(ages) MyTable)
関数呼び出しのパラメーターに基づき、Net.Data は、 結果表に関する情報 (たとえば、戻される列と行の数、 結果行など) を含む完全なアプレット・タグを生成します。 Net.Data は、次の例のように、 結果表のセルごとに 1 つのパラメーター・タグを生成します。
param name = 'DTW_MyTable_ages_VALUE_1' value = "35">
パラメーター名 DTW_MyTable_ages_VALUE_1 は、 表 MyTable の表セル (行 1、列 ages) を指定します。 このセルの値は 4 です。アプレットへの関数呼び出しの際のキーワード DTW_COLUMN は、 必要なのは結果表 MyTable の列 ages だけであることを指定します。
@DTWA_MyGraph(MyTitle, DTW_COLUMN(ages) MyTable)
以下の出力は、この例に対して Net.Data が生成する完全なアプレット・タグを示しています。
<applet code = 'MyGraph.class' codebase = '/netdata-java/' 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 = "35"> <param name = 'DTW_MyTable_ages_VALUE_2' value = "32"> <param name = 'DTW_MyTable_ages_VALUE_3' value = "31" > <param name = 'DTW_MyTable_ages_VALUE_4' value = "28" > <param name = 'DTW_MyTable_ages_VALUE_5' value = "40" > <P>Sorry, your browser is not Java-enabled.<BR> </applet>
Net.Data は、DTW_Applet.class と呼ばれるインターフェース・セットを提供しています。これを Java アプレットで使用すると、表変数に対して生成される PARAM タグを処理するのに役に立ちます。 このインターフェースを拡張するアプレットを作成して、 アプレットからそのルーチンを呼び出すことができます。
Net.Data が提供するインターフェースには以下のものがあります。
インターフェースにアクセスするには、 EXTENDS キーワードをアプレットのコードで使用して、 アプレットを 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 アプリケーションをサポートします。 Java アプレットおよび Java メソッド (またはアプリケーション) をサポートすることで、 Java データベース・コネクティビティー (JDBC**) API から DB2 へのアクセスが可能です。
JDBC に関する詳細は、以下の Web サイトで入手できます。
http://www.software.ibm.com/data/db2/java/
http://splash.javasoft.com/jdbc/
Java 言語環境を使用するには、Net.Data 初期設定を検証し、 言語環境を設定する必要があります。
以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認します。
ENVIRONMENT (DTW_JAVAPPS) ( OUT RETURN_CODE ) CLIETTE "DTW_JAVAPPS"
Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。
重要 : Java 言語環境の設定方法については、 Java 言語環境のセットアップを参照してください。
Java 言語環境には、 リモート・プロシージャー呼び出し (RPC) と同様のインターフェースが提供されています。 Net.Data ストリングをパラメーターに持つ Net.Data マクロから、 Java 関数呼び出しが発行でき、起動した Java 関数からストリングが戻されます。 Java 言語環境を使用する際は、 Net.Data Live Connection を使用する必要があります (Live Connection に関する詳細は、 接続管理を参照)。
Java 関数の呼び出し方法
新規の Java 関数を追加する度に、Java クライエットを再度作成する必要があります。
Java 関数サンプル・ファイル UserFunctions.java を変更するか、 または以下の myfile.java という名前のサンプル・ファイルをモデルに、 新規ファイルを作成します。
====================myfile.java==================== import mypackage.* <=contain your functions public String myfctcall(...parameters from macro...) { return ( mypackage.mymethod(...parameters...)); <=high-level call to your functions } public String lowlevelcall(...parameters...) { string result; .......code using many functions of your package... return(result) }
Net.Data は、Net.Data のインストール中に複数のディレクトリーを作成します。 これらのディレクトリーには、以下のような、Java 関数の作成、クライエットの定義、 および Java 言語環境でのマクロの実行に必要なファイルが含まれています。
表 12 には、ご使用のオペレーティング・システムにおけるファイルの、 ディレクトリーおよびファイル名が記述されています。
オペレーティング・システム | ファイル名 | ディレクトリー |
---|---|---|
OS/2 | UserFunctions.java | javaapps |
launchjv.com | connect | |
Windows NT | UserFunctions.java | javaclas |
makeClas.bat | javaclas | |
launchjv.bat | connect | |
UNIX | UserFunctions.java | javaapps |
launchjv | javaapps |
サンプル・ファイル makeClas.bat を変更するか、 または新規の .bat ファイルを作成し、すべての Java 関数について、 dtw_samp.class という名前の Net.Data クライエット・クラスを生成します。 以下の例に、 バッチ・ファイル CreateServer による 3 つの Java 関数の処理方法を示します。
rem Batch file to create dtw_samp for Net.Data java CreateServer dtw_samp.java UserFunctions.java myfile.java javac dtw_samp.java
バッチ・ファイルは、 Net.Data に提供される Stub.java という名前のスタブ・ファイルに加えて、 以下のファイルを処理して dtw_samp.class を作成します。
JDBC アプリケーションまたはアプレットの作成は、DB2 CLI または ODBC を使用した、 データベース・アクセス用 C アプリケーションの作成に類似しています。 アプリケーションとアプレットの主な違いとして、 アプリケーションは DB2 との通信に特別なソフトウェア (たとえば、 DB2 クライアント・アプリケーション・イネーブラー) を必要とする場合があります。 アプレットは Java を使用可能な Web ブラウザーに依存し、 DB2 コードがクライアントにインストールされている必要はありません。
JDBC を使用する前に、システムの構成を行う必要があります。 これらの考慮事項については、 DB2 JDBC アプリケーションおよびアプレット・サポートの Web サイトで説明されています。
http://www.software.ibm.com/data/db2/jdbc/db2java.html
Java 関数の作成、クライエット・クラスの定義、および Net.Data の構成が終了したら、 Java 関数への参照を含むマクロを実行することができます。 重要 : Net.Data マクロを起動する前に、 接続管理プログラムを開始してください。
以下の例では、関数呼び出しの myfctcall が、 クライエット DTW_JAVAPPS を使用して、 Net.Data に提供されるサンプル関数を呼び出します。
%FUNCTION (DTW_JAVAPPS) myfctcall( ....parameters from macro ....) %{ to call the sample provided with Net.Data %} %FUNCTION (DTW_JAVAPPS) reverse_line(str); %HTML(report){ you should see the string "Hello World" in reverse. @reverse_line("Hello World") You should have the result of your function call. @myfctcall( ... ....) %}
Perl 言語環境は、Net.Data マクロの FUNCTION ブロックで指定した、 インラインの Perl スクリプトを解釈することができます。あるいは、 サーバー上の別ファイルに保管されている外部の Perl スクリプトを処理することができます。
以下の構成ステートメントが、 Net.Data の初期設定ファイルに 1 行で記述されていることを確認してください。
ENVIRONMENT (DTW_PERL) DTWPERL ( OUT RETURN_CODE )
Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。
外部 Perl スクリプトの呼び出しは、 EXEC ステートメントにより FUNCTION ブロックで識別されます。 使用する構文は以下のとおりです。
%EXEC{ perl_script_name [optional parameters] %}
必須 : Perl のスクリプト名 perl_script_name が、 Net.Data の初期設定ファイルの EXEC_PATH 構成変数に対して指定されているパスに、 リストされていることを確認してください。
%FUNCTION(DTW_PERL) rexx1() { %EXEC{MyPerl.pl %} %}
Perl によって呼び出されるプログラムに情報を渡すには、 2 つの方法があります (DTW_PERL 言語環境では、直接渡しと間接渡し)。
%DEFINE INPARM1 = "SWITCH1" %FUNCTION(DTW_PERL) sys1() { %EXEC{ MyPerl.pl $(INPARM1) "literal string" %} %}
Net.Data 変数 INPARM1 が参照され、Perl スクリプトに渡されます。 パラメーターを Perl スクリプトに渡す方法は、 Perl スクリプトがコマンド行から呼び出された場合に、 Perl スクリプトにパラメーターを渡すのと同じです。 この方法で渡されるパラメーターは、 入力タイプのパラメーターと考えられます (Perl スクリプトに渡されるパラメーターは、 Perl スクリプトで使用し、操作することができますが、 パラメーターの変更は Net.Data には反映されません)。
以下に示す方法のいずれかを使用して、 Perl スクリプトの呼び出し時に間接的にパラメーターを渡します。
name="value"
データ項目が複数ある場合は、各項目を改行あるいはブランク文字で区切ります。
変数名が出力パラメーターと同じ名前で上記の構文を使用する場合、 現行値は新規値により置き換えられます。 変数名が出力パラメーターに対応しない場合は、Net.Data はその変数を無視します。
以下の例では、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.pl と呼ばれる外部ファイルにある場合は、 次の例にある関数と同じ関数を作成することができます。
%FUNCTION(DTW_PERL) today() RETURNS(result) { %EXEC { today.pl %} %}
Net.Data の表は、Perl 言語環境で呼び出される Perl スクリプトに渡すことができます。 Perl スクリプトは、Net.Data 名によって、 Net.Data のマクロの表パラメーターの値にアクセスします。 列見出しおよびフィールド値は、表名および列番号により識別される変数に含まれます。 たとえばテーブル myTable では、 列見出しは myTable_N_j で、 フィールド値は myTable_V_i_j です。 ここで、i は行番号、j は列番号です。 テーブルの行および列番号は、 myTable_ROWS および myTable_COLS です。
REPORT および MESSAGE ブロックは、 どの FUNCTION セクションにおいても同じように使用することができます。 これらのブロックは Net.Data によって処理され、言語環境では処理されません。 ただし、Perl スクリプトはテキストを標準出力ストリームに書き込み、 Web ページの一部として組み込むことはできます。
次の例は、Net.Data が外部 Perl スクリプトを実行して、 どのように表を生成するかを示しています。
%define { c = %TABLE(20) rows = "5" columns = "5" %} %function(DTW_PERL) genTable(in rows, in columns, out table) { %exec{ perl.pl %} %message{ default: "genTable: Unexpected Error" %} %} %HTML(REPORT) { @genTable(rows, columns, c) return code is $(RETURN_CODE) %} The Perl script (perl.pl): open(D2W,"> $ENV{DTWPIPE}"); print "genTable begins ... "; $r = $ENV{ROWS}; $c = $ENV{COLUMNS}; print D2W "table_ROWS=\"$r\" "; print D2W "table_COLS=\"$c\" "; print "rows: $r "; print "columns: $c"; for ($j=1; $j<=$c; $j++) { print D2W "table_N_$j=\"COL$j\" "; } for ($i=1; $i<=$r; $i++) { for ($j=1; $j<=$c; $j++) { print D2W "table_V_$i","_","$j=\"&splitvbar. $i $j &invq.\" "; } } close(D2W);
結果 : genTable は以下を生成します。
rows: 5 columns: 5 COL1 | COL2 | COL3 | COL4 | COL5 | -------------------------------------------------- [ 1 1 ] | [ 1 2 ] | [ 1 3 ] | [ 1 4 ] | [ 1 5 ] | -------------------------------------------------- [ 2 1 ] | [ 2 2 ] | [ 2 3 ] | [ 2 4 ] | [ 2 5 ] | -------------------------------------------------- [ 3 1 ] | [ 3 2 ] | [ 3 3 ] | [ 3 4 ] | [ 3 5 ] | -------------------------------------------------- [ 4 1 ] | [ 4 2 ] | [ 4 3 ] | [ 4 4 ] | [ 4 5 ] | -------------------------------------------------- [ 5 1 ] | [ 5 2 ] | [ 5 3 ] | [ 5 4 ] | [ 5 5 ] | -------------------------------------------------- return code is 0
REXX 言語環境を使用すると、REXX プログラムを実行することができます。
REXX 言語環境を使用するには、Net.Data 初期設定を検証し、 言語環境を設定する必要があります。
以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認します。
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) 言語環境を使用する関数で、 REXX ステートメントで実行される EXEC プログラムを含む関数を定義します。
例 : 外部プログラムを指す EXEC ステートメントを含む関数
%function(DTW_REXX) externalHelloWorld() { %EXEC{ helloworld.exe%} %}
必須 : REXX ファイル名は、 Net.Data の初期設定ファイルにある EXEC_PATH 構成変数に対して指定されているパスにリストされていることを確認してください。 EXEC_PATH 構成変数の定義方法を理解するには、 EXEC_PATH を参照してください。
REXX (DTW_REXX) 言語環境によって呼び出される REXX プログラムに情報を渡すには、 直接的な方法と間接的な方法の 2 つがあります。
%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) 関数が呼び出されると、REXX プログラムの実行の前に、入力 (IN) または入出力 (INOUT) となる関数仮引き数が REXX 言語環境により変数プールに保管されます。 REXX プログラムは、起動されると、これらの変数に直接アクセスすることができます。 REXX プログラムが正常に終了すると、DTW_REXX 言語環境は、 OUT または INOUT 関数仮引き数があるかどうかを判別します。 ある場合は、 言語環境はこの関数パラメーターに対応する値を変数プールから検索し、 この新しい値で関数パラメーター値を更新します。 Net.Data は、制御を受け取ると、 REXX 言語環境から取得した新しい値ですべての OUT または INOUT パラメーターを更新します。 たとえば、以下のような場合です。
%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 の 2 つのパラメーターが渡されます。 REXX 関数 double_func は、第 1 パラメーターを 2 倍にし、 その結果を第 2 パラメーターに保管します。 Net.Data がマクロを呼び出すと、b の値は 6 になります。
Net.Data の表を REXX プログラムに渡すことができます。 REXX プログラムでは、 Net.Data マクロの表パラメーターの値には REXX の stem 変数としてアクセスします。 REXX プログラムでは、列見出しおよびフィールド値は、 表名および列番号で識別される変数に含まれます。 たとえば、表 myTable では、 列見出しは myTable_N.j であり、 フィールド値は myTable_N.i.j です。 ここで、i は行番号、j は列番号です。 この表の行数は myTable_ROWS であり、 行数は myTable_COLS です。
AIX システムで REXX 言語環境への呼び出しが多くある場合は、 RXQUEUE_OWNER_PID 環境変数を 0 に設定してください。 REXX 言語環境に多くの呼び出しを行うマクロは、 多くのプロセスを spawn しやすくなり、システム資源が消費されます。
以下の 3 つの方法のいずれかで環境変数を設定します。
@DTW_rSETENV("RXQUEUE_OWNER_PID", "0")
/etc/environment: RXQUEUE_OWNER_PID = 0
この方法は、マシン全体の REXX の振る舞いに影響を与えます。
InheritEnv RXQUEUE_OWNER_PID = 0
この方法は、Web サーバーの REXX の振る舞いに影響を与えます。
以下の例では、REXX 関数を呼び出して 2 つの列および 3 つの行を持つ 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) %}
結果は以下のとおりです。
COL1 COL2 [ 1 1 ] [ 1 2 ] [ 2 1 ] [ 2 2 ] [ 3 1 ] [ 3 2 ]
System 言語環境では、コマンドの実行と外部プログラムの呼び出しをサポートしています。
以下の構成ステートメントを初期設定ファイルに 1 行で追加します。
ENVIRONMENT (DTW_SYSTEM) DTWSYS ( OUT RETURN_CODE )
Net.Data 初期設定ファイル、 および言語環境の ENVIRONMENT ステートメントの詳細は、環境構成ステートメントを参照してください。
コマンドを発行するには、 EXEC ステートメントで発行されるコマンドへのパスを含む System (DTW_SYSTEM) 言語環境を使用する関数を定義します。 たとえば、以下のような場合です。
%FUNCTION(DTW_SYSTEM) sys1() { %EXEC { ADDLIBLE.CMD %} %}
EXEC_PATH 構成変数を使用して、 オブジェクト (コマンドおよびプログラムなど) を含むディレクトリーへのパスを定義すると、 実行可能なオブジェクトへのパスを短縮することができます。 EXEC_PATH 構成変数の定義方法を理解するには、 EXEC_PATH を参照してください。
例 1: コマンドを発行する
%FUNCTION(DTW_SYSTEM) sys2() { %EXEC { MYPGM %} %}
例 2: プログラムの呼び出し
%FUNCTION(DTW_SYSTEM) sys3() { %EXEC {MYPGM.EXE %} %
System (DTW_SYSTEM) 言語環境により起動するプログラムに情報を渡すには、 直接および間接の 2 とおりの方法があります。
%DEFINE INPARM1 = "SWITCH1" %FUNCTION(DTW_SYSTEM) sys1() { %EXEC{ CALL1.CMD $(INPARM1) "literal string" %} %}
Net.Data 変数 INPARM1 が参照され、プログラムに渡されます。 パラメーターはプログラムに渡されます。 これはコマンド行からプログラムを呼び出す場合と同様に行われます。 このメソッドを使用してプログラムに渡されるパラメーターは、 入力型パラメーターとみなされます (プログラムに渡されるパラメーターは、 そのプログラムにより使用して操作できますが、 パラメーターに対する変更は Net.Data に反映されません)。
System 言語環境は Net.Data 変数を直接に渡すまたは検索することができないため、 以下のようにしてプログラムに対し変数を使用可能にします。
name="value"
複数のデータ項目の場合、各項目を改行あるいはブランク文字で区切ります。
変数名が出力パラメーターと同じ名前であり、上記の構文を使用する場合、 現行値は新規値により置き換えられます。 変数名が出力パラメーターに対応しない場合は、Net.Data はその変数を無視します。
以下の例では、Net.Data がマクロから変数を渡す方法を示しています。
%FUNCTION(DTW_SYSTEM) sys1 (IN P1, OUT P2, P3) { %EXEC { UPDPGM %} %}
Net.Data 表を、System 言語環境によって呼び出されるプログラムに渡すことができます。 プログラムでは、Net.Dataマクロの表パラメーターの値に、Net.Data 名でアクセスします。 列見出しおよびフィールド値は、表名および列番号で識別される変数に含まれます。 たとえば、表 myTable では、 列見出しは myTable_N_j で、 フィールド値は myTable_V_i_j です。 ここで、i は行番号、j は列番号です。 この表の行と列の数は myTable_ROWS と myTable_COLS です。
プロセスに対する環境変数の数には制限があるため、 行が多い表を渡すことはお勧めできません。
以下の例では、 3 つのパラメーター P1、P2、 および P3 を持つ関数定義を含むマクロを示しています。P1 は入力 (IN) パラメーター、 P2 および P3 は出力 (OUT) パラメーターです。 この関数はプログラム UPDPGM を呼び出して、 パラメーター P2 を P1 の値で更新し、 P3 を文字ストリングに設定します。 %EXEC ブロックのステートメントを処理する前に、 DTW_SYSTEM 言語環境は P1 および対応する値を環境スペースに保管します。
%DEFINE { MYPARM2 = "ValueOfParm2" MYPARM3 = "ValueOfParm3" %} %FUNCTION(DTW_SYSTEM) sys1 (IN P1, OUT P2, P3) { %EXEC { UPDPGM %} %} %HTML(upd1) { <P> Passing data to a program. The current value of MYPARM2 is "$(MYPARM2)", and the current value of MYPARM3 is "$(MYPARM3)". Now we invoke the Web macro function. @sys1("ValueOfParm1", MYPARM2, MYPARM3) <P> After the function call, the value of MYPARM2 is "$(MYPARM2)", and the value of MYPARM3 is "$(MYPARM3)". %}