StoredProcedureResult call (java.lang.String sql, Object... parameters)
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:
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:
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:
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: