Das folgende Beispiel veranschaulicht einen strukturierten Datensatzabschnitt mit einer unterstrukturierten Feldgruppe:
Record myPart type basicRecord
10 MyTopStructure CHAR(20)[5];
20 MyStructureField01 CHAR(10);
20 MyStructureField02 CHAR(10);
end
Die Wrapperklassen für ein bestimmtes Programm werden im Folgenden auch als Programmwrapperklassen, Parameterwrapperklassen, Wrapperklassen für dynamische Feldgruppen und Wrapperklassen für Feldgruppen mit unterstrukturierten Feldern bezeichnet.
EGL generiert eine Klasse 'BeanInfo' für die einzelnen Parameterwrapperklassen, Wrapperklassen für dynamische Feldgruppen und Wrapperklassen für Feldgruppen mit unterstrukturierten Feldern. Die Klasse 'BeanInfo' ermöglicht die Verwendung der zugehörigen Wrapperklassen als Java-kompatible Java-Bean. Sie werden wahrscheinlich nicht mit der Klasse 'BeanInfo' interagieren.
Wenn Sie einen Wrapper generieren, darf die Parameterliste des aufgerufenen Programms keine Parameter des Typs BLOB, CLOB, Dictionary oder ArrayDictionary und keine nicht strukturierten Datensätze enthalten.
import com.ibm.javart.JavartException;
import com.ibm.javart.calls.*;
public class MyNativeClass
{
/* declare a variable for middleware */
PowerServer powerServer = null;
powerServer = new PowerServerImpl();
}
Die von einem SharedResourcePowerServer-Objekt bereitgestellte Funktionalität ist umfassender als die eines PowerServer-Objekts. Nähere Angaben zu SharedResourcePowerServer-Objekten finden Sie im Abschnitt 'SharedResourcePowerServer'.
Wenn Sie kein PowerServer-Objekt angeben, stellt die EGL-Laufzeitumgebung ein PowerServer-Objekt für Sie bereit.
// Die Verwendung eines PowerServer-Objekts ist optional.
myProgram = new MyprogramWrapper(PowerServer);
Sie können ein PowerServer-Objekt bereitstellen, wenn Sie das Wrapperobjekt aufrufen. Sie können es auch bereitstellen, indem Sie die Wrapperobjektmethode 'setPowerServer' aufrufen.
Mypart myParm = myProgram.getMyParm();
Mypart2 myParm2 = myProgram.getMyParm2();
myRecArrayVar myParm3 = myProgram.getMyParm3();
Nähere Angaben zur Interaktion mit dynamischen Feldgruppen finden Sie in Wrapperklassen für dynamische Feldgruppen.
myProgram.setMyRecord(inputValue);
Die Benutzer-ID und das Kennwort werden nicht für den Datenbankzugriff verwendet.
myProgram.callOptions.setUserID("myID");
myProgram.callOptions.setPassword("myWord");
myUserID = myProgram.callOptions.getUserID();
myPassword = myProgram.callOptions.getPassword();
// Eine Verbindung zur Datenbank wird hergestellt.
Connection con = DriverManager.getConnection( "jdbc:db2://host:50000/db", "user", "pwd" );
// Der Modus für automatisches Commit wird inaktiviert, um Transaktionen zu ermöglichen.
con.setAutoCommit( false );
// Der Wrapper wird erstellt und es wird eine Verbindung hinzugefügt.
MWrapper mw = new MWrapper();
mw.addConnection( con, "con1" );
// Das Programm wird ausgeführt.
mw.execute();
// Die Arbeit wird festgeschrieben und es erfolgt eine Bereinigung.
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();
Bei Verwendung eines einzelnen PowerServer-Objekts kann unter Umständen folgende Situation eintreten: Die EGL-Laufzeitumgebung schreibt eine über eine einleitende Verbindung vorgenommene Änderung fest, beim Festschreiben einer über eine zweite Verbindung vorgenommenen Änderung tritt jedoch ein Problem auf und das Festschreiben schlägt fehl. Nach einem Fehler verbleiben die Daten in einem inkonsistenten Status, da es sich bei dem Festschreiben um eine einphasige Festschreibung und nicht um eine zweiphasige Festschreibung handelt, sodass alle Ressourcen festgeschrieben werden oder keine.
Das Middlewareobjekt wird geschlossen, um die EGL-Ausführungseinheit zu beenden und eine Garbage-Collection zu ermöglichen:
if ( powerServer != null )
{
try
{
powerServer.close();
powerServer = null;
}
catch ( JavartException error )
{
System.out.println( "Error closing middleware"
+ error.getMessage() );
System.exit( 8 );
}
}
Die Programmwrapperklasse enthält für jeden Parameter im generierten Programm eine private Instanzvariable. Wenn es sich bei dem Parameter um einen Datensatz oder ein Formular handelt, verweist die Variable auf eine Instanz der zugehörigen Parameterwrapperklasse. Basiert der Parameter auf einem DataItem-Abschnitt, weist die Variable einen Java-Basiselementtyp auf.
Eine Beschreibung zur Konvertierung zwischen EGL- und Java-Typen können Sie einer Tabelle am Ende dieser Hilfetextseite entnehmen.
ZweckParametername()
setPassword(Kennwort)
setUserid(BenutzerID)
getPassword()
getUserid()
Die Ausführungseinheit kann zuvor angegebene Verbindungen, soweit vorhanden, verwenden. Wird jedoch eine derartige Verbindung von der Ausführungseinheit geschlossen, erfolgt die Freigabe und die Verbindung kann anschließend nicht erneut geöffnet werden. Die letztgenannte Einschränkung gilt, auch wenn das Schließen im EGL-Programm oder über einen Aufruf von powerServer.close() (wie in einem vorherigen Abschnitt dargestellt) erfolgt.
public void addConnection
(java.sql.Connection Verbindung, java.lang.String Name, int Option_für_Verbindungsabbruch)
throws java.lang.NullPointerException, java.lang.IllegalArgumentException, com.ibm.javart.JavartException
'powerServer.close()' bewirkt ein Festschreiben der Arbeit (Commit) und Beenden der EGL-Ausführungseinheit. Bei allen anderen Optionen für Verbindungsabbruch geht mit dem Beenden der EGL-Ausführungszeit das Schließen offener Verbindungen einher.
Mit Ausnahme des ersten Werts entsprechen die zuvor angegebenen Werte Werten, die Sie beim Aufruf der Systemfunktion sqlLib.connect() angeben können. Dabei handelt es sich um folgende Werte aus der EGL-Aufzählung egl.io.sql.DisconnectKind: DisconnectKind.automatic, DisconnectKind.conditional, DisconnectKind.explicit. Ein dem Wert DISCONNECT_NEVER entsprechender Wert kann bei Aufruf von sqlLib.connect() nicht angegeben werden.
Das Ereignis 'PropertyChange' wird in der JavaBean-Spezifikation von Oracle beschrieben.
Mypart myRecWrapperObject = myProgram.getMyrecord();
In diesem Fall verwenden Sie den vom Programmwrapperobjekt reservierten Speicher.
Sie können die Parameterwrapperklasse auch zum Deklarieren von Speicher verwenden. Dies ist notwendig, wenn Sie die Methode 'call' (und nicht die Methode 'execute') des Programmobjekts aufrufen.
ZweckName_des_strukturierten_Felds()
ZweckName_des_strukturierten_FeldsNullIndicator()
Parameterklassenname.Feldgruppenklassenname
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
Wenn der Parameter Company auf CompanyPart basiert, verwenden Sie als Namen der untergeordneten Klasse die Zeichenfolge CompanyPart.Departments.
Eine untergeordnete Klasse einer untergeordneten Klasse erweitert die Verwendung der Punktsyntax. Bei dem genannten Beispiel verwenden Sie das Symbol CompanyPart.Departments.Functioncode als Namen der untergeordneten Klasse von Departments.
Weitere Einzelheiten zur Namensgebung bei Wrapperklassen für Feldgruppen mit unterstrukturierten Feldern finden Sie im Abschnitt Ausgabe der Java-Wrappergenerierung.
Program myProgram(intParms int[], recParms MyRec[])
Die Namen der Wrapperklassen für dynamische Feldgruppen sind IntParmsArray und MyRecArray.
IntParmsArray myIntArrayVar = myProgram.getIntParms();
MyRecArray myRecArrayVar = myProgram.getRecParms();
Nach dem Deklarieren der Variablen für die einzelnen dynamischen Feldgruppen können Sie bei Bedarf wie folgt Elemente hinzufügen:
// Das Hinzufügen zu einer Feldgruppe mit Java-Basiselementen
// erfolgt in einem Schritt.
myIntArrayVar.add(new Integer(5));
// Das Hinzufügen zu einer Feldgruppe mit Datensätzen oder Formularen
// erfordert mehrere Schritte. In diesem Fall wird mit dem
// Zuordnen eines neuen Satzobjekts begonnen.
MyRec myLocalRec = (MyRec)myRecArrayVar.makeNewElement();
// Die Schritte für die Zuordnung von Werten sind in diesem
// Beispiel nicht gezeigt. Fügen Sie nach dem Zuordnen von
// Werten den Datensatz zur Feldgruppe hinzu.
myRecArrayVar.add(myLocalRec);
// Es schließt sich die Ausführung des Programms an.
myProgram.execute();
// Nach Rückkehr des Programms können Sie die
// Anzahl der Elemente in der Feldgruppe bestimmen.
int myIntArrayVarSize = myIntArrayVar.size();
// Rufen Sie das erste Element der Integer-Feldgruppe ab und
// setzen Sie es als Integer-Objekt um.
Integer firstIntElement = (Integer)myIntArrayVar.get(0);
// Rufen Sie das zweite Element der Satzfeldgruppe ab.
// setzen Sie es in ein Objekt 'MyRec' um.
MyRec secondRecElement = (MyRec)myRecArrayVar.get(1);
Wie im Beispiel angedeutet stellt EGL verschiedene Methoden für die Bearbeitung der von Ihnen deklarierten Variablen bereit.
| Methode der Klasse für dynamische Feldgruppen | Zweck |
|---|---|
| add(int, Objekt) | Einfügen eines Objekts an der durch int angegebenen Position und Verschieben des aktuellen Elements sowie der nachfolgenden Elemente nach rechts |
| add(Objekt) | Anfügen eines Objekts am Ende der dynamischen Feldgruppe |
| addAll(Feldgruppenliste) | Anfügen einer Feldgruppenliste am Ende der dynamischen Feldgruppe |
| get() | Abrufen des Feldgruppenlistenobjekts, das alle Elemente der Feldgruppe enthält |
| get(int) | Abrufen des Elements, das sich an der durch int angegebenen Position befindet |
| makeNewElement() | Zuordnen eines neuen Elements des feldgruppenspezifischen Typs und Abrufen dieses Elements, ohne es zur dynamischen Feldgruppe hinzuzufügen |
| maxSize() | Abrufen eines ganzzahligen Werts, der die maximale (nicht die tatsächliche) Anzahl von Elementen in der dynamischen Feldgruppe angibt |
| remove(int) | Entfernen des Elements, das sich an der durch int angegebenen Position befindet |
| set(Feldgruppenliste) | Verwenden der angegebenen Feldgruppenliste als Ersatz für die dynamische Feldgruppe |
| set(int, Objekt) | Verwenden des angegebenen Objekts als Ersatz für das Element, das sich an der von int angegebenen Position befindet |
| size() | Abrufen der Anzahl von Elementen in der dynamischen Feldgruppe |
Die nachfolgende Tabelle gibt Aufschluss über die Beziehung zwischen EGL-Basiselementtypen im generierten Programm und den Java-Datentypen im generierten Wrapper.
| EGL-Basiselementtyp | Länge in Zeichen oder Stellen | Länge in Bytes | Dezimalstellen | Java-Datentyp | Maximale Genauigkeit in 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 | - | Boolean | - |
| CHAR | 1-32767 | 2-32766 | - | String | - |
| DBCHAR | 1-16383 | 1-32767 | - | String | - |
| DATE | 8 | 8 | 0 | java.sql.Date | - |
| 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 | - | byte[] | - |
| INTERVAL (Zeitspanne in Monaten oder Sekunden) | 1-21 | 2-22 | 0 | String | - |
| MBCHAR | 1-32767 | 1-32767 | - | String | - |
| 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 | - | String | - |
| TIME | 6 | 6 | 0 | java.sql.Time | - |
| TIMESTAMP | 1-20 | 1-20 | 0 | java.sql. Timestamp | - |
| UNICODE | 1-16383 | 2-32766 | - | String | - |