Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » Unterstützung für externe Umgebungen in SQL Anywhere

 

Die externe Java-Umgebung

SQL Anywhere stellt Unterstützung für gespeicherte Java-Prozeduren und -Funktionen bereit. Eine gespeicherte Java-Prozedur oder -Funktion verhält sich wie eine gespeicherte SQL-Prozedur oder Funktion, abgesehen davon, dass der Code für die Prozedur oder Funktion in Java geschrieben ist und die Ausführung der Prozedur oder Funktion außerhalb des Datenbankservers stattfindet (d.h. innerhalb einer Java Virtual Machine-Umgebung). Beachten Sie, dass es eine Instanz der Java VM für jede Datenbank statt einer Instanz für jede Verbindung gibt. Gespeicherte Java-Prozeduren können Ergebnismengen zurückgeben.

Es gibt einige Voraussetzungen für die Verwendung der Unterstützung für Java in der Datenbank:

  1. Eine Kopie der Java-Laufzeitumgebung muss auf dem Datenbankserversystem installiert sein.

  2. Der SQL Anywhere-Datenbankserver muss in der Lage sein, die Position des Java-Programms (der Java VM) zu ermitteln.

Um Java in der Datenbank zu verwenden, achten Sie darauf, dass der Datenbankserver in der Lage ist, das Java-Programm aufzufinden und zu starten. Sie überprüfen dies, indem Sie Folgendes ausführen:

START EXTERNAL ENVIRONMENT JAVA;

Wenn der Datenbankserver Java nicht starten kann, liegt die Ursache des Problems wahrscheinlich darin, dass der Datenbankserver das Java-Programm nicht finden kann. In diesem Fall sollten Sie die Anweisung ALTER EXTERNAL ENVIRONMENT ausführen, um den Speicherort des Java-Programms explizit einzustellen. Achten Sie darauf, den Programmdateinamen einzubeziehen.

ALTER EXTERNAL ENVIRONMENT JAVA
  LOCATION 'Java-Pfad';

Zum Beispiel:

ALTER EXTERNAL ENVIRONMENT PERL
  LOCATION 'c:\\jdk1.6.0\\jre\\bin\\java.exe';

Beachten Sie, dass die Anweisung START EXTERNAL ENVIRONMENT JAVA nur benötigt wird, um zu überprüfen, ob der Datenbankserver in der Lage ist, die Java VM zu starten. Im Allgemeinen führt das Ausführen eines gespeicherten Java-Prozedur- oder -Funktionsaufrufs dazu, dass die Java VM automatisch gestartet wird.

Gleichermaßen ist die Anweisung STOP EXTERNAL ENVIRONMENT JAVA nicht erforderlich, um eine Instanz von Java zu stoppen, da die Instanz automatisch entfernt wird, wenn alle Verbindungen zur Datenbank beendet wurden. Wenn Sie allerdings die Arbeit mit Java vollständig abgeschlossen haben und einige Ressourcen freigeben wollen, vermindert die Anweisung STOP EXTERNAL ENVIRONMENT JAVA die Verwendungsanzahl für die Java VM.

Nachdem Sie überprüft haben, dass der Datenbankserver das Java VM-Programm starten kann, besteht der nächste Schritt darin, den erforderlichen Java-Klassencode in der Datenbank zu installieren. Sie erreichen dies, indem Sie die Anweisung INSTALL JAVA verwenden. Sie können beispielsweise die folgende Anweisung ausführen, um eine Java-Klasse von einer Datei in der Datenbank zu installieren.

INSTALL JAVA 
NEW 
FROM FILE 'Java-Klassendatei';

Sie können auch eine Java JAR-Datei in der Datenbank installieren.

INSTALL JAVA 
NEW
JAR 'JAR-Name'
FROM FILE 'JAR-Datei';

Java-Klassen können wie folgt von einer Variablen installiert werden:

CREATE VARIABLE JavaClass LONG VARCHAR;
SET JavaClass = xp_read_file('Java-Klassendatei
INSTALL JAVA 
NEW
FROM JavaClass;

Java JAR-Dateien können wie folgt von einer Variablen installiert werden:

CREATE VARIABLE JavaJar LONG VARCHAR;
SET JavaJar = xp_read_file('JAR-Datei
INSTALL JAVA 
NEW
JAR 'JAR-Name'
FROM JavaJar;

Um eine Java-Klasse aus der Datenbank zu entfernen, verwenden Sie die Anweisung REMOVE JAVA:

REMOVE JAVA CLASS 'Java-Klasse'

Um eine Java JAR-Datei aus der Datenbank zu entfernen, verwenden Sie die Anweisung REMOVE JAVA:

REMOVE JAVA JAR 'JAR_Name'

Um bestehende Java-Klassen zu ändern, können Sie die UPDATE-Klausel der Anweisung INSTALL JAVA verwenden:

INSTALL JAVA 
UPDATE
FROM FILE 'Java-Klassendatei'

Sie können auch bestehende Java JAR-Dateien in der Datenbank aktualisieren.

INSTALL JAVA 
UPDATE
JAR 'JAR-Name'
FROM FILE 'JAR-Datei';

Java-Klassen können wie folgt von einer Variablen aktualisiert werden:

CREATE VARIABLE JavaClass LONG VARCHAR;
SET JavaClass = xp_read_file('Java-Klassendatei
INSTALL JAVA 
UPDATE
FROM JavaClass;

Java JAR-Dateien können wie folgt von einer Variablen aktualisiert werden:

CREATE VARIABLE JavaJar LONG VARCHAR;
SET JavaJar = xp_read_file('JAR-Datei
INSTALL JAVA 
UPDATE
FROM JavaJar;

Nachdem die Java-Klasse in der Datenbank installiert ist, können Sie gespeicherte Prozeduren und Funktionen erstellen, um eine Schnittstelle zu den Java-Methoden herzustellen. Die Zeichenfolge der EXTERNAL NAME-Klausel enthält die erforderlichen Informationen, um die Java-Methode aufzurufen und um OUT-Parameter und Rückgabewerte zurückzugeben. Das LANGUAGE-Attribut der EXTERNAL NAME-Klausel muss JAVA angeben. Das Format der EXTERNAL NAME-Klausel ist folgendes:

EXTERNAL NAME 'Java-Aufruf' LANGUAGE JAVA
Java-Aufruf :
[Paketname.]Klassenname.Methodenname Methodensignatur
Methodensignatur : 
( [ Felddeskriptor, ... ] ) Rückgabedeskriptor
Felddeskriptor und Rückgabedeskriptor :
Z 
| B 
| S 
| I 
| J 
| F 
| D 
| C 
| V
| [Deskriptor 
| LKlassenname;

Eine Java-Methodensignatur ist die kompakte Zeichendarstellung der Parametertypen und des Ergebniswerttyps. Wenn die Anzahl der Parameter geringer ist als die in der Methodensignatur angegebene Zahl, muss der Unterschied der Zahl entsprechen, die in DYNAMIC RESULT SETS angegeben wurde. Jeder Parameter in der Methodensignatur, der nicht in der Parameterliste für die Prozedur enthalten ist, muss die Methodensignatur [Ljava/SQL/ResultSet; haben.

Der Felddeskriptor und Rückgabedeskriptor haben die folgenden Bedeutungen:

Feldtyp Java-Datentyp
B byte
C char
D double
F float
I int
J long
L Klassenname; Eine Instanz der Klasse Klassenname. Die Klasse muss voll qualifiziert sein und alle Punkte im Namen müssen durch das Zeichen / ersetzt werden. Beispiel: java/lang/String
S short
V void
Z Boolescher Wert
[ Verwenden Sie jeweils eine für jede Felddimension.

Zum Beispiel,

double some_method(
  boolean a,
  int b,
  java.math.BigDecimal c,
  byte [][] d,
  java.sql.ResultSet[] rs ) {
}

Dieses Beispiel hätte folgende Signatur:

'(ZILjava/math/BigDecimal;[[B[Ljava/SQL/ResultSet;)D'

Die folgende Prozedur erstellt eine Schnittstelle zu einer Java-Methode. Die Java-Methode gibt keinen Wert zurück (V).

CREATE PROCEDURE insertfix() 
EXTERNAL NAME 'JDBCExample.InsertFixed()V' 
LANGUAGE JAVA;

Die folgende Prozedur erstellt eine Schnittstelle zu einer Java-Methode, die ein String-Eingabeargument ([Ljava/lang/String;) hat. Die Java-Methode gibt keinen Wert zurück (V).

CREATE PROCEDURE InvoiceMain( IN arg1 CHAR(50) )
EXTERNAL NAME 'Invoice.main([Ljava/lang/String;)V'
LANGUAGE JAVA;

Die folgende Prozedur erstellt eine Schnittstelle zu einer Java-Methode Invoice.init, die ein String-Argument (Ljava/lang/String;) übernimmt, sowie ein Double (D), ein weiteres String-Argument (Ljava/lang/String;) und ein weiteres Double (D), und die keinen Wert zurückgibt (V).

CREATE PROCEDURE init( IN arg1 CHAR(50),
                       IN arg2 DOUBLE, 
                       IN arg3 CHAR(50), 
                       IN arg4 DOUBLE) 
EXTERNAL NAME 'Invoice.init(Ljava/lang/String;DLjava/lang/String;D)V'
LANGUAGE JAVA

Weitere Hinweise zum Aufrufen von Java-Methoden finden Sie unter Auf Methoden in der Java-Klasse zugreifen.

Weitere Hinweise zur Rückgabe von Ergebnismengen finden Sie unter Ergebnismengen aus Java-Methoden zurückgeben.

Das folgende Java-Beispiel übernimmt eine Zeichenfolge und schreibt sie in das Meldungsfenster des Datenbankservers:

import java.io.*;

public class Hello
{
    public static void main( String[] args )
    {
        System.out.print( "Hello" );
               for ( int i = 0; i  < args.length; i++ )
                   System.out.print( " " + args[i] );
        System.out.println();
    }
}

Der obenstehende Java-Code wird in die Datei Hello.java abgelegt und mit dem Java-Compiler kompiliert. Die resultierende Klassendatei wird folgendermaßen in die Datenbank geladen:

INSTALL JAVA 
NEW 
FROM FILE 'Hello.class';

Unter Verwendung von Interactive SQL wird die gespeicherte Prozedur, die eine Schnittstelle zur Methode main in der Klasse Hello herstellt, folgendermaßen erstellt:

CREATE PROCEDURE HelloDemo( IN name LONG VARCHAR ) 
EXTERNAL NAME 'Hello.main([Ljava/lang/String;)V'
LANGUAGE JAVA;

Beachten Sie, dass das Argument zu main als Array von java.lang.String beschrieben wird. Unter Verwendung von Interactive SQL testen Sie die Schnittstelle, indem Sie die folgende SQL-Anweisung ausführen.

CALL HelloDemo('SQL Anywhere');

Wenn Sie das Meldungsfenster des Datenbankservers überprüfen, werden Sie dort die Meldung angezeigt sehen. Die gesamte Ausgabe an System.out wird zum Fenster "Datenbankservermeldungen" umgeleitet.

Zusätzliche Hinweise und Beispiele zur Verwendung der Unterstützung für Java in der Datenbank finden Sie unter Java-Unterstützung in SQL Anywhere.