Code: Select all
public JSONArray getClosedPeriodDataMap(String spName, Map inParams) {
SimpleJdbcCall simpleJdbcCall =
jdbcCallFactory.create()
.withProcedureName(spName)
.withNamedBinding()
.returningResultSet("JSONObjectList", new JSONObjectRowMapper());
MapSqlParameterSource source = new MapSqlParameterSource(inParams);
var resultsMap = simpleJdbcCall.execute(source);
JSONArray resultArray = new JSONArray();
resultArray.putAll(resultsMap.get("JSONObjectList"));
return resultArray;
}
Code: Select all
Map params = new HashMap();
SqlParameterValue idValue = SqlParameterHelper.makeIntValue("ID", 1);
params.put("ID", idValue);
request.setParams(params);
Code: Select all
static SqlParameterValue makeIntValue(String name, int value) {
SqlParameter param = new SqlParameter(name, Types.INTEGER);
return new SqlParameterValue(param, value);
}
< /code>
Der in Parameter scheint korrekt gebunden zu werden. Der Ausgangsparameter wird als Rückgabeparameter ordnungsgemäß erkannt. Nur wenn der Anrufprozess versucht, die aufrufende Zeichenfolge zu analysieren, die er erstellt hat, wird er verwirrt. < /P>
Die Tabelle wird wie folgt erstellt: < /p>
CREATE TABLE EMPLOYEE_TIME(
ID INT PRIMARY KEY,
NAME VARCHAR(20) not null,
START_DATE DATE not null ,
END_DATE DATE,
HOURS_WORKED NUMERIC not null
);
< /code>
Die Prozedur, die immer eine Java -Methode in Apache Derby sein muss, wird wie folgt erstellt: < /p>
CREATE PROCEDURE EMPLOYEE_TIME_BY_ID(IN ID INTEGER)
PARAMETER STYLE JAVA
LANGUAGE JAVA
MODIFIES SQL DATA
DYNAMIC RESULT SETS 1
EXTERNAL NAME 'com.something.StoredProcedures.getEmployeeTimeById';
< /code>
Die Methode (die aufgrund der Parse -Ausnahme nie annähernd aufgerufen wird) ist wie folgt definiert: < /p>
public static class StoredProcedures {
public void getEmployeeTimeById(final int id, ResultSet[] timesheets) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:default:connection");
PreparedStatement ps = conn.prepareStatement("SELECT * FROM DBA.EMPLOYEE_TIME WHERE id = ?")) {
ps.setInt(1, id);
ResultSet results = ps.executeQuery();
timesheets[0] = results;
}
}
< /code>
übrigens ist eine typische APache -Derby -Aufruf -String so etwas wie < /p>
CallableStatement cs = conn.prepareCall("{ call MY_PROC(?, ?)}");
Beachten Sie, dass es no => gibt. Es ist nicht klar, warum dieser bizarre "Pfeil" in die Anrufzeichenfolge eingefügt wird. Vielleicht besteht die beste Lösung darin, die SimpleJdbccall insgesamt die Aufruf durch einen normalen JDBC -Callablestatement aufzurufen. org.springFramework.jdbc.core.metadata.genericAldaDaProvider.NamedParameterBindingTouse () , aber nur, wenn der angegebene Parameter ein benannter Parameter ist. Es spielt keine Rolle, ob Simplejdbccall.withnamedBinding () Methode aufgerufen wird, wenn der deklarierte Parameter einen Namen erhält. Wenn der Parameter beispielsweise als SQLParameter mit einem Namen bereitgestellt wird. Jeder benannte Parameter führt dazu, dass der Apache -Derby Parser eine Ausnahme ausführt, wenn er versucht, den Operator => zu analysieren. Es kann möglich sein, org.springframework.jdbc.core.metadata.callmetadatacontext.CreateParameterbinding () zu ignorieren, benannte Bindung und einfach zurück "?" anstelle von "id =>?" DerbyCallMetAdatAProvider.NamedParameterBindingTouse () , das die Methode der Superklasse genericCallMetAdaProvider verwendet. Im Gegensatz dazu erzeugen sowohl Sybase- als auch SQLServer -Implementierungen dieser Methode so etwas wie "ID?" . Ich weiß nicht, ob Derby diese Syntax verarbeiten kann. Es ist also wahrscheinlich besser, die benannte Parameterbindung mit Apache -Derby zu vermeiden, es sei denn, der Parser wird in der Anrufstring oder dem DerbyCallMetadataprovider zu handhaben. NamedParameterBindinguse (). Alle benannten Parameter aus meinem Testcode und versuchen Sie es erneut. Die hilfreiche Antwort von @Life888888 verwendet keine benannten Parameter. Es scheint eine Schande, dass Apache Derby benannte Parameter nicht verarbeiten kann, da es sich um eine leistungsstarke Funktion und eine der Begründungen für die Verwendung von Spring -JDBC -Klassen handelt.