OUT- und INOUT-Parameter in StoredProcedureResult-Objekten

Wenn ein StoredProcedureResult-Objekt zurückgegeben wird, befindet sich der Wert eines von der gespeicherten Prozedur zurückgegebenen Parameters OUT oder INOUT in dem Object[], das von der Methode getOutputParms() von StoredProcedureResult zurückgegeben wird.
StoredProcedureResult-Objekte werden von folgender Version der Methode call() der Schnittstelle Data zurückgegeben:
StoredProcedureResult call (java.lang.String sql, Object... parameters)

Positionsgebundene Parameter übergeben

Zur Veranschaulichung kann eine gespeicherte Prozedur dienen, die so definiert ist, dass sie zwei IN-Parameter Integer, einen OUT-Parameter Float und keine zurückgegebenen Abfrageergebnisse aufweist. Sie könnten Sie mit einer Logik wie der folgenden aufrufen:

Integer one = new Integer(1);                                                      1 
Integer three = new Integer(3);
Connection con = DriverManager.getConnection(...);                                 2 
Data db = DataFactory.getData(con);                                                3 

StoredProcedureResult spr = db.call("CALL getRatio(?, ?, ?)", one, three, null);   4 
Object[] outputs = spr.getOutputParms();                                           5 
Float oneThird = outputs[2]; // outputs is Object[3]                               6 
spr.close();   // empfohlene Methode                                               7 

Der Code führt die folgenden Schritte aus:

  1. Deklariert und initialisiert zwei Variablen, die für die Parameter IN verwendet werden.
  2. Stellt eine Verbindung zur Datenbank her.
  3. Erstellt eine Instanz der Implementierung der Schnittstelle Data.
  4. Ruft die Methode Data.call() auf, führt die Anweisung CALL aus, die die Werte der IN-Parameter weitergibt, und speichert das Ergebnis in einer Implementierung von StoredProcedureResult.
  5. Speichert die Werte der Parameter INOUT und OUT in einem Array Object[]. Parameter IN werden nicht in das Array gestellt und haben einen Platzhalter von NULL.
  6. Speichert den Wert des Parameters OUT in einem Float-Objekt. Beachten Sie, dass der Wert des Parameters OUT das dritte Objekt im Array ist, weil die ersten beiden Objekte die Werte der IN-Parameter sind.
  7. Schließt und gibt alle Ressourcen frei, die StoredProcedureResult spr zugeordnet sind.

Die Fragezeichen sind Marken für positionsgebundene Parameter. Das erste entspricht dem Parameter 'Integer one', das zweite dem Parameter 'Integer three' und das letzte dem Parameter 'null'. Der Nullwert ist ein Platzhalter für den Wert des Parameters OUT einer gespeicherten Prozedur.

Weiteres Beispiel: Angenommen, Sie verfügen nur über Teilinformationen bezüglich der SQL-Methode getRatio(). Wenn Sie nicht wussten, dass die Methode getRatio() keine Abfrageergebnisse zurückgibt und ob zugehörige IN-Parameter auch OUT-Parameter waren, kann die Logik eher wie folgt aussehen:

Integer one = new Integer(1);                                                      1 
Integer three = new Integer(3);
Connection con = DriverManager.getConnection(...);                                 2 
Data db = DataFactory.getData(con);                                                3 

StoredProcedureResult spr = db.call("CALL getRatio(?, ?, ?)", one, three, null);  4 
Object[] outputs = spr.getOutputParms();                                          5 
for (int j = 0; j < outputs.length; j++)                                          6 
 System.out.println(j + ": " + outputs[j]); 

 while (spr.moveToNext()) {                                                       7 
      ResultSet rsPtr = spr.getResults();
      ...                                                                         8 
   }
}

spr.close();                                                                      9 

Der Code führt die folgenden Schritte aus:

  1. Deklariert und initialisiert zwei Variablen, die für die Parameter IN verwendet werden.
  2. Stellt eine Verbindung zur Datenbank her.
  3. Erstellt eine Instanz der Implementierung der Schnittstelle Data.
  4. Ruft die Methode Data.call() auf, führt die Anweisung CALL aus, die die Werte der IN-Parameter weitergibt, und speichert das Ergebnis in einer Implementierung von StoredProcedureResult.
  5. Speichert die Werte der Parameter INOUT und OUT in einem Array Object[]. Parameter IN werden nicht in das Array gestellt und haben einen Platzhalter von NULL.
  6. Gibt die Werte im Array Object[] aus.
  7. Falls die gespeicherte Prozedur Abfrageergebnisse zurückgegeben hat, wird das aktuelle zurückgegebene ResultSet geschlossen und zum nächsten ResultSet gewechselt.
  8. Verarbeitet das aktuelle ResultSet, auf das rsPtr verweist.
  9. Schließt und gibt alle Ressourcen frei, die StoredProcedureResult spr zugeordnet sind.

Parameter in Beans übergeben

Wenn die Parameter der Methode Data.call() entweder in einer Bean oder in einem Objekt Map übergeben werden, werden die Werte der zurückgegebenen OUT- und INOUT-Parameter der gespeicherten Prozedur im Array Object[] angezeigt und dienen zur Aktualisierung der gegebenen Bean oder des gegebenen Objekts Map.

Beispiel: Eine Bean, Ratio, mit den Eigenschaften 'numerator', 'denominator' und 'ratio'.

Integer one = new Integer(1);                                                      1 
Integer three = new Integer(3);
Ratio rValue = new Ratio(one, three);                           2 
Connection con = DriverManager.getConnection(...);              3 
Data db = DataFactory.getData(con);                             4 

StoredProcedureResult spr = db.call(
  "CALL getRatio(:numerator, :denominator, :ratio)", rValue);   5 
Float oneThird = rValue.getRatio();                             6 
spr.close();                                                    7 

In diesem Beispiel gibt die Verwendung der Parametermarken :name an, dass es nur einen Parameter gibt, bei dem es sich um die Bean handelt, obwohl es sich ebenso gut um ein Objekt Map handeln hätte können.

Der Code führt die folgenden Schritte aus:

  1. Deklariert und initialisiert zwei Variablen, one und three.
  2. Deklariert und initialisiert einen Verweis auf einen neuen rValue der Bean Ratio, indem dem Konstruktur 'one' und 'three' übergeben werden, um die Werte von 'numerator' und 'denominator' bereitzustellen.
  3. Stellt eine Verbindung zur Datenbank her.
  4. Erstellt eine Instanz der Implementierung der Schnittstelle Data.
  5. Ruft die Methode Data.call() auf. Dazu wird die Anweisung CALL ausgeführt, die in rValue übergeben wird. Die Eigenschaften numerator und denominator stellen die IN-Parameter und ratio den Parameter OUT dar. Durch die Anweisung CALL wird der Wert von ratio aktualisiert.
  6. Speichert den Wert von 'ratio' in dem neuen Float-Objekt oneThird.
  7. Schließt und gibt alle Ressourcen frei, die StoredProcedureResult spr zugeordnet sind.

Parameter in Map-Objekten übergeben

Stellen Sie sich vor, dass eine gespeicherte Prozedur durch Übergeben von Werten aufgerufen wird, die den Eigenschaften einer Bean DeptProject für eine Projekt-ID und ein neues Enddatum für das Projekt entsprechen. Der Parameter OUT stellt einen aktualisierten Personalstand dar, der für dieses Abteilungsprojekt benötigt wird.

Sie werden kaum eine gespeicherte Prozedur nur für diesen Zweck entwickeln, aber untergeordnete sind in übergeordneten Projekten enthalten, sodass eine Aktualisierung des Enddatums für ein einzelnes Projekt mehrere übergeordnete Projekte betreffen kann. Für diese Art kaskadierender Operationen sind gespeicherte Prozeduren hervorragend geeignet. Der der Methode call() übergebene Parameter kann ein Objekt DeptProject sein, es ist jedoch nicht empfehlenswert, Objekte zu verwenden, die nie vollständig gefüllt oder wie eine vollständig gefüllte Instanz verwendet werden sollen. Ein Objekt Map ist eine bessere Wahl für diese Art der Verwendung.

In diesem Beispiel könnte ein Aufruf dieser gespeicherten Prozedur wie folgt aussehen:

Map<String, Object> slipMap;                                             1 

//...                                                                    2 

Connection con = DriverManager.getConnection(...);                       3 
Data db = DataFactory.getData(con);                                      4 

StoredProcedureResult spr = db.call(
  "CALL newEndDate(":projectId, :endDate, :staffLevel)", slipMap );      5 
spr.close();                                                             6 

Der Code führt die folgenden Schritte aus:

  1. Deklariert die neue Map slipMap.
  2. Legt projectId und endDate in slipMap fest.
  3. Stellt eine Verbindung zur Datenbank her.
  4. Erstellt eine Instanz der Implementierung der Schnittstelle Data.
  5. Ruft die Methode Data.call() auf. Hierzu wird die in slipMap übergebene Anweisung CALL ausgeführt. Die Eigenschaften projectId und endDate stellen die IN-Parameter und staffLevel den Parameter OUT dar. Durch die Anweisung CALL wird der Wert von staffLevel aktualsiert.
  6. Schließt und gibt alle Ressourcen frei, die StoredProcedureResult spr zugeordnet sind.

Feedback