So berufen Sie das von Apache Derby gespeicherte Prozedur mit Spring SimplejdbccallJava

Java-Forum
Anonymous
 So berufen Sie das von Apache Derby gespeicherte Prozedur mit Spring Simplejdbccall

Post by Anonymous »

Ich habe ein Apache -Derby mit einem einzigen Ganzzahl -Parameter mit dem Namen "ID" geschrieben. Ich versuche, dies mit Spring JDBCs SimpleJDBCCall aufzurufen. Nachdem die gespeicherte Prozedur nachgeschaut wurde und der Parameter an meinen Eingabeparameter gebunden ist, erstellt das SimpleJdbccall die folgende Zeichenfolge, die den Anruf [{call Employee_time_by_id (id =>?)}] . An diesem Punkt erhalte ich einen Parse -Fehler, wenn er auf die> stößt. Es sieht so aus, als hätte der Parser keine Ahnung, wie man in der Anrufzeichenfolge den Sinn für => macht. Warum wird dies also in die Anrufzeichenfolge eingefügt, um sie später später abzulehnen? Bad SQL Grammar [{{capeee_time_by_id (id =>?)}] . Der erste Parameter für diese Methode ist die Aufruf -String {rufen Sie die Mitarbeiter_Time_By_ID (ID =>?)} . Dies ruft eine private Methode auf, die schließlich eine Ausnahme mit der Nachricht org.apache.derby.impl.sql.compile.parseException: auf ">" in Zeile 1, Spalte 31 ausgelöst hat. Der Fehlercode ist 42x01 . Das gespeicherte Verfahren wird wie folgt aufgerufen: < /p>

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;
}
wobei Inparams eine Karte mit einem Parameter ist, der als SQLParameterervalue wie folgt definiert ist:

Code: Select all

  Map params = new HashMap();
SqlParameterValue idValue = SqlParameterHelper.makeIntValue("ID", 1);
params.put("ID", idValue);
request.setParams(params);
und SQLParameterHelper.MakeIntValue () ist definiert als:

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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post