Frühjahr SimpleJdbcCall Standard (optionale) Argumente
Ich versuche eine gespeicherte Prozedur aufrufen, die standardmäßig (optional) ohne Argumente übergeben, und es funktioniert nicht. Im wesentlichen das gleiche problem wie beschrieben hier.
Mein code:
SqlParameterSource in = new MapSqlParameterSource()
.addValue("ownname", "USER")
.addValue("tabname", cachedTableName)
.addValue("estimate_percent", 20)
.addValue("method_opt", "FOR ALL COLUMNS SIZE 1")
.addValue("degree", 0)
.addValue("granularity", "AUTO")
.addValue("cascade", Boolean.TRUE)
.addValue("no_invalidate", Boolean.FALSE)
.addValue("force", Boolean.FALSE);
Und ich bekomme eine exception:
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Required input parameter 'PARTNAME' is missing
at org.springframework.jdbc.core.CallableStatementCreatorFactory$CallableStatementCreatorImpl.createCallableStatement(CallableStatementCreatorFactory.java:209)
Wo PARTNAME " ist ein optionaler parameter gemäß diese. Auch durch die Tatsache bestätigt, dass ich diese Prozedur auszuführen, w/o wird die PARTNAME-argument manuell.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ater geben auf diese Frage, und nur auf der Durchreise alle Parameter, einschließlich der optionalen, ich lief in seine Unfähigkeit zu übergeben boolean Argumente, weil boolean ist nicht ein SQL-Datentyp, nur PL/SQL.
Also meine aktuelle Lösung ist, dass JDBC nicht geeignet für gespeicherte Prozeduren ausgeführt werden und dies ist, wie ich arbeite um ihn herum:
Kam mit eine anständige Lösung für dieses heute, das verkraftet der nicht-null-Standardwerte und nicht fruchtig Reflexions-Techniken. Es funktioniert, indem die Metadaten, die den Kontext für die Funktion extern abrufen, all die parameter-Typen und so weiter, dann Bau die SimpleJdbcCall manuell, aus, dass.
Erstellen Sie zunächst eine CallMetaDataContext für die Funktion:
Erstellen Sie als Nächstes die SimpleJdbcCall, aber zwingen Sie es nicht tun, Ihre eigenen Metadaten-Suche:
Hier ist ein anderer Ansatz, den ich genommen habe. Ich fügte hinzu, die Möglichkeit für den Benutzer, um die Anzahl der Parameter, die Sie erbringen auf der nennen. Diese werden die ersten n-Anzahl der Parameter. Alle verbleibenden Parameter, die in der stored-proc, festgelegt werden, über die Datenbank den Standardwert Handhabung. Dadurch können neue Parameter Hinzugefügt werden, um das Ende der Liste mit Standard-Werten oder null sein kann, ohne zu brechen code, der nicht weiß, geben Sie einen Wert ein.
Ich untergeordnetes SimpleJdbcCall und fügte hinzu, die Methoden zum setzen der "maxParamCount". Ich habe auch ein bisschen eine böse Reflexion auf meine untergeordnetes version von CallMetaDataContext.
In meinem CallMetaDataContext sub-Klasse, ich Speichere die maxInParamCount, und verwenden Sie es trimmen, um die Liste der Parameter bekannt, gibt es in der stored-proc.
Verwenden, ist im Grunde das gleiche, außer für seeting der max parameter count.
KLEINER RANT: Es ist lustig, dass der Frühling ist bekannt für seine IOC-container. Aber innerhalb seiner utility-Klassen, die ich zu dem Mittel greifen müssen, um Reflexion, um eine Alternative Implementierung einer abhängigen Klasse.
War auch zu kämpfen mit dem problem, und wollte nicht mit Zeichenfolgen.
Es könnte mehr interessante Lösung, wenn man default-Werte von meta-Daten, die der Frühling kümmert sich nicht darum, in der default-Implementierung, aber ich kann einfach gestellt werden, null-Werte gibt.
Die Lösung kam, wie die folgenden:
Überschrieben simpleJdbcCall
Und überschrieben CallableStatementCreatorFactory
Ich diese util-Methode: