副構造配列がある構造化レコード・パーツの例を以下に示します。
Record myPart type basicRecord
10 MyTopStructure CHAR(20)[5];
20 MyStructureField01 CHAR(10);
20 MyStructureField02 CHAR(10);
end
後述の説明では、プログラム・ラッパー・クラス、パラメーター・ラッパー・クラス、動的配列ラッパー・クラス、および副構造フィールド配列ラッパー・クラスとしての指定プログラムのラッパー・クラスについて言及します。
EGL は、パラメーター・ラッパー・クラス、動的配列ラッパー・クラス、または副構造フィールド配列ラッパー・クラスのそれぞれに対して BeanInfo クラスを生成します。 BeanInfo クラスでは、関連するラッパー・クラスを Java 準拠の Java Bean として使用できます。 ただし、BeanInfo クラスとやり取りすることはほとんどありません。
ラッパーを生成する場合、呼び出し先プログラムのパラメーター・リストでは BLOB、CLOB、Dictionary、ArrayDictionary、または非構造化レコードのタイプのパラメーターは組み込むことができません。
import com.ibm.javart.JavartException;
import com.ibm.javart.calls.*;
public class MyNativeClass
{
/* declare a variable for middleware */
PowerServer powerServer = null;
powerServer = new PowerServerImpl();
}
SharedResourcePowerServer オブジェクトによって提供される機能は、PowerServer オブジェクトによって提供される機能より広範囲です。 前者の詳細については、『SharedResourcePowerServer』を参照してください。
PowerServer オブジェクトが指定されていない場合は、EGL ランタイムが自動的に指定します。
// use of a PowerServer object is optional
myProgram = new MyprogramWrapper(PowerServer);
ラッパー・オブジェクトの呼び出し時、またはラッパー・オブジェクト・メソッド setPowerServer を呼び出すことにより、PowerServer オブジェクトを指定できます。
Mypart myParm = myProgram.getMyParm();
Mypart2 myParm2 = myProgram.getMyParm2();
myRecArrayVar myParm3 = myProgram.getMyParm3();
動的配列の扱いについて詳しくは、動的配列ラッパー・クラスを参照してください。
myProgram.setMyRecord(inputValue);
このユーザー ID およびパスワードは、データベース・アクセスには使用されません。
myProgram.callOptions.setUserID("myID");
myProgram.callOptions.setPassword("myWord");
myUserID = myProgram.callOptions.getUserID();
myPassword = myProgram.callOptions.getPassword();
// Connect to the database
Connection con = DriverManager.getConnection( "jdbc:db2://host:50000/db", "user", "pwd" );
// Turn off auto-commit mode to enable transactions
con.setAutoCommit( false );
// Create the wrapper and give it the connection
MWrapper mw = new MWrapper();
mw.addConnection( con, "con1" );
// Run the program
mw.execute();
// Commit the work and clean up
mw.getPowerServer().commit();
mw.getPowerServer().close();
con.close();
int returnValue = myProgram.returnCode();
myProgram.execute();
myProgram.setParm1( 2 );
myProgram.setParm2( "sell" );
myProgram.execute();
myProgram.call( 2, "sell" );
powerServer.commit();
powerServer.rollBack();
単一の PowerServer オブジェクトを使用する場合、EGL ランタイムは、初回の接続で行った変更をコミットできますが、2 回目の接続で行った変更をコミットすると問題が発生して失敗することがあります。コミットは、すべてのリソースがコミットされるかどのリソースもコミットされないような 2 フェーズ・コミットではなく 1 フェーズ・コミットであるため、失敗後にデータは矛盾した状態のままになります。
EGL 実行単位を終了して、ガーベッジ・コレクションを実行できるようにするには、ミドルウェア・オブジェクトを閉じます。
if ( powerServer != null )
{
try
{
powerServer.close();
powerServer = null;
}
catch ( JavartException error )
{
System.out.println( "Error closing middleware"
+ error.getMessage() );
System.exit( 8 );
}
}
プログラム・ラッパー・クラスには、生成済みプログラム内の各パラメーターごとにプライベート・インスタンス変数が含まれます。 パラメーターがレコードまたはフォームである場合、変数は、関連するパラメーター・ラッパー・クラスのインスタンスを参照します。 そのパラメーターがデータ項目パーツに基づいている場合、変数の型はプリミティブ Java です。
このヘルプ・ページの最後にある表には、EGL と Java の各型の間の変換が説明されています。
purposeParmname()
setPassword(passWord)
setUserid(userid)
getPassword()
getUserid()
実行単位は、以前に指定された接続がある場合は、その接続を使用できます。ただし、実行単位が特定の接続を閉じると、接続は解放され、再オープンできません。その最後の制約事項は、EGL プログラムで閉じる場合、あるいは (前のセクションで示したように) powerServer.close() を呼び出すことで閉じる場合に当てはまります。
public void addConnection
(java.sql.Connection con, java.lang.String name, int disconnectOption)
throws java.lang.NullPointerException, java.lang.IllegalArgumentException, com.ibm.javart.JavartException
powerServer.close() コミットは機能し、EGL 実行単位を閉じます。その他すべての切断オプションでは、実行単位を終了すると、開いているすべての接続が閉じます。
以前の値のうち、最初の値を除くすべての値が、システム関数 sqlLib.connect() の呼び出し時に指定できる値と同じ意味を持ちます。 EGL 列挙 egl.io.sql.DisconnectKind の同等の値は、DisconnectKind.automatic、DisconnectKind.conditional、DisconnectKind.explicit です。DISCONNECT_NEVER と同等の値は、sqlLib.connect() の呼び出し時には無効です。
PropertyChange イベントは、Oracle の JavaBean 仕様で説明されています。
Mypart myRecWrapperObject = myProgram.getMyrecord();
このケースでは、プログラム・ラッパー・オブジェクトによって割り振られたメモリーを使用しています。
また、プログラム・オブジェクトの (execute メソッドではなく) call メソッドを呼び出す場合には、必要に応じてパラメーター・ラッパー・クラスをメモリーの宣言にも使用できます。
purposesiName()
purposesiNameNullIndicator()
ParameterClassname.ArrayClassName
Record CompanyPart type basicRecord
10 Departments CHAR(20)[5];
20 CountryCode CHAR(10);
20 FunctionCode CHAR(10)[3];
30 FunctionCategory CHAR(4);
30 FunctionDetail CHAR(6);
end
パラメーター Company が CompanyPart に基づいている場合は、 内部クラスの名前として文字列 CompanyPart.Departments を使用します。
内部クラスの内部クラスにより、ドットの構文の使用が拡張されます。 この例では、シンボル CompanyPart.Departments.Functioncode を Departments の内部クラスの名前として使用します。
副構造フィールド配列ラッパー・クラスの命名方法について詳しくは、『Java ラッパー生成の出力』を参照してください。
Program myProgram(intParms int[], recParms MyRec[])
動的配列ラッパー・クラスの名前は、IntParmsArray および MyRecArray です。
IntParmsArray myIntArrayVar = myProgram.getIntParms();
MyRecArray myRecArrayVar = myProgram.getRecParms();
それぞれの動的配列用の変数を宣言した後、以下のような要素を追加します。
// Java プリミティブへの配列の追加は、
// 1 ステップのプロセスです
myIntArrayVar.add(new Integer(5));
// レコードまたはフォームの配列への追加には、
// 複数のステップが必要であり、このケースでは、
// 新規レコード・オブジェクトの割り振りで開始します
MyRec myLocalRec = (MyRec)myRecArrayVar.makeNewElement();
// 値を割り当てるステップはこの例に示されていませんが、
// 値を割り当てた後に、
// 配列にレコードを追加します
myRecArrayVar.add(myLocalRec);
// 次に、プログラムを実行します
myProgram.execute();
// プログラムが戻ると、
// 配列内の要素数を判別できます
int myIntArrayVarSize = myIntArrayVar.size();
// 整数配列の最初の要素を取得し、
// Integer オブジェクトにそれをキャストします
Integer firstIntElement = (Integer)myIntArrayVar.get(0);
// レコード配列の 2 番目の要素を取得し、
// MyRec オブジェクトにそれをキャストします
MyRec secondRecElement = (MyRec)myRecArrayVar.get(1);
上記の例で示されているように、EGL では宣言した変数を操作する複数のメソッドが提供されています。
| 動的配列クラスのメソッド | 用途 |
|---|---|
| add(int, Object) | int で指定された位置にオブジェクトを挿入する。 現在および後続の各要素を右にシフトする。 |
| add(Object) | 動的配列の最後にオブジェクトを追加する。 |
| addAll(ArrayList) | 動的配列の最後に ArrayList を追加する。 |
| get() | 配列内のすべての要素が格納された ArrayList オブジェクトを取得する |
| get(int) | int で指定された位置にある要素を取得する。 |
| makeNewElement() | 要素を動的配列に追加することなく、配列固有の型の新規要素を割り振り、その要素を取得する。 |
| maxSize() | 動的配列内の最大要素数 (実際の数ではない) を表す整数を取得する。 |
| remove(int) | int で指定された位置にある要素を除去する。 |
| set(ArrayList) | 指定した ArrayList を動的配列の置き換えとして使用する。 |
| set(int, Object) | 指定したオブジェクトを int で指定された位置にある要素の置き換えとして使用する。 |
| size() | 動的配列内にある要素数を取得する。 |
下の表に、生成されるプログラム内の EGL プリミティブ型と、生成されるラッパー内の Java データ型の関係を示します。
| EGL プリミティブ型 | 文字または桁の長さ | 長さ (バイト) | 小数部 | Java データ型 | Java での最大精度 |
|---|---|---|---|---|---|
| BIN、SMALLINT | 4 | 2 | 0 | short | 4 |
| BIN、INT | 9 | 4 | 0 | int | 9 |
| BIN、BIGINT | 18 | 8 | 0 | long | 18 |
| BIN | 4 | 2 | >0 | float | 4 |
| BIN | 9 | 4 | >0 | double | 15 |
| BIN | 18 | 8 | >0 | double | 15 |
| BOOLEAN | 1 | 1 | NA | Boolean | NA |
| CHAR | 1-32767 | 2-32766 | NA | String | NA |
| DBCHAR | 1-16383 | 1-32767 | NA | String | NA |
| DATE | 8 | 8 | 0 | java.sql.Date | NA |
| DECIMAL、MONEY、PACF | 1 から 3 | 1 から 2 | 0 | short | 4 |
| DECIMAL、MONEY、PACF | 4 から 9 | 3 から 5 | 0 | int | 9 |
| DECIMAL、MONEY、PACF | 10 から 18 | 6 から 10 | 0 | long | 18 |
| DECIMAL、MONEY、PACF | 19-32 | 10-17 | 0 | java.math.BigInteger | 32 |
| DECIMAL、MONEY、PACF | 1 から 5 | 1 から 3 | >0 | float | 6 |
| DECIMAL、MONEY、PACF | 7 から 18 | 4 から 10 | >0 | double | 15 |
| DECIMAL、MONEY、PACF | 19-32 | 10-17 | >0 | java.math.BigDecimal | 32 |
| FLOAT | 18 | 8 | >0 | double | 15 |
| HEX | 2-75534 | 1-32767 | NA | byte[] | NA |
| INTERVAL (month- or second-span) | 1 から 21 | 2 から 22 | 0 | String | NA |
| MBCHAR | 1-32767 | 1-32767 | NA | String | NA |
| NUM、NUMC | 1 から 4 | 1 から 4 | 0 | short | 4 |
| NUM、NUMC | 5 から 9 | 5 から 9 | 0 | int | 9 |
| NUM、NUMC | 10 から 18 | 10 から 18 | 0 | long | 18 |
| NUM、NUMC | 19-32 | 19-32 | 0 | java.math.BigInteger | 32 |
| NUM、NUMC | 1 から 6 | 1 から 6 | >0 | float | 6 |
| NUM、NUMC | 7 から 18 | 7 から 18 | >0 | double | 15 |
| NUM、NUMC | 19-32 | 19-32 | >0 | java.math.BigDecimal | 32 |
| SMALLFLOAT | 9 | 4 | >0 | float | 6 |
| STRING | 1-16383 | 2-32766 | NA | String | NA |
| TIME | 6 | 6 | 0 | java.sql.Time | NA |
| TIMESTAMP | 1 から 20 | 1 から 20 | 0 | java.sql. Timestamp | NA |
| UNICODE | 1-16383 | 2-32766 | NA | String | NA |