Abfrage vom JDBC Mediator
Ein SDO-Client kann den JDBC Data Mediator Service (DMS) mit einer SELECT-Anweisung angeben, um die Anweisung zu ersetzen, die aus den DMS-Metadaten generiert wird.
Wenn der SDO-Client einen DMS instanziert, verwendet der DMS die definierenden Metadaten, um eine Basis-SELECT-Anweisung zu generieren. Das Ersetzen dieser Abfrage gibt Ihnen die Möglichkeit, Parametermarken anzugeben. Damit haben Sie mehr Kontrolle über die Clientdaten in einem dataGraph. Verwenden Sie eine SQL-SELECT-Standardzeichenfolge für eine vom Client bereitgestellte Abfrage.
Sowohl bei eigenen als auch bei generierten Abfragen werden für jedes DataObject automatisch UPDATE-, INSERT- und DELETE-Anweisungen generiert. Sie werden angewendet, wenn der Mediator die Änderungen am DataGraph in der Datenbank festschreibt.
Parameter-DataObjects für eigene Abfragen
Clients können mit einem Parameter-DataObject Argumente für eine SQL-Abfrage SELECT angeben. Ein Parameter-DataObject ist ein DataObject, jedoch nicht Bestandteil eines DataGraph. Es wird vom JDBC DMS auf Anforderung des Clients konstruiert. Das Parameter-DataObject für eigene Abfragen wird ausgehend von der an den Mediator übergebenen Abfrage erstellt. Jeder Parameter in der Abfrage hat einen Namen wie arg0, arg1, …, argX.
Da ein Parameter-DataObject ein DataObject ist, können Sie dessen Eigenschaften über den Eigenschaftsnamen oder einen Indexwert definieren. Für die Referenzierung der Eigenschaften können Sie den argX-Namen oder die dem Parameter zugeordnete Nummer 0, 1, …, X verwenden. Nehmen wir an, Ihre Abfrage lautet “SELECT CUSTFIRSTNAME WHERE CUSTSTATE = ? AND CUSTZIP = ?”. Diese Abfrage enthält zwei Parameter. Der erste Parameter korrespondiert mit CUSTSTATE und kann mit der Zeichenfolge “arg0” oder dem Index 0 definiert werden. Der zweite Parameter korrespondiert mit CUSTZIP und kann mit der Zeichenfolge “arg1” oder dem Index 1 definiert werden. Der folgende Beispielcode zeigt, wie diese Parameter gesetzt werden. Bei diesem Code wird vorausgesetzt, dass Sie die Metadaten bereits vorliegen und mit der oben angegebenen Abfrage an den Mediator übergeben wurden. Bei Verwendung eines Indexwertes sieht Ihr Code wie folgt aus:
DataObject parameters = mediator.getParameterDataObject();
parameter.setString(0, "NY");
parameter.setInt(1, 12345);
DataObject graph = mediator.getGraph(parameters);
Bei Verwendung eines Eigenschaftsnamens sieht Ihr Code wie folgt aus:
DataObject parameters = mediator.getParameterDataObject();
parameters.setString("arg0", "NY");
parameters.setInt("arg1", 12345);
DataObject graph = mediator.getGraph(parameters);
Die Ergebnisse sind in beiden Fällen dieselben.
Einschränkungen
Die vom JDBC DMS generierte SQL-Abfrage SELECT wird von Oracle oder Informix nicht voll unterstützt, weil der Mediator die Schnittstelle "ResultSetMetaData" von JDBC 2.0 nutzt und dessen vollständige Implementierung voraussetzt. Oracle, Informix, DB2/390 und ältere unterstützte Versionen von Sybase implementieren die Schnittstelle "ResultSetMetaData" nicht vollständig. Vorgegebene SELECT-Anweisungen können mit diesen Datenbanken dennoch verwendet werden, allerdings mit einer Ausnahme: Die Spalten der Metadaten müssen für alle Tabellen eindeutig sein. Gibt die SELECT-Anweisung eine Spalte mit einem Namen zurück, der mehrfach in den Metadaten vorkommt, tritt eine InvalidMetadataException ein. Nehmen wir an, die Tabellen Customer (Kunde) und Order (Bestellung) enthalten beide eine Spalte “ID”. Dies wäre ungültig und würde zu Fehlern führen. Sie können dieses Problem lösen, indem Sie den Namen einer der übereinstimmenden Spalten in der Datenbank ändern, so dass die Spalten unterschieden werden können. In der Tabelle Customer könnte der Spaltenname beispielsweise in “CUSTID” geändert werden. Den Spaltenname in der Tabelle Order könnten Sie in “ORDERID” ändern. Wenn Sie den Spaltennamen für Customer geändert haben, müssen Sie den Spaltennamen für Order nicht ändern. Dies wäre nur aus Konsistenzgründen anzuraten.