我有下面的代码创建StoredProcedure
的子类并执行它。我想实现的目标是不止一次地使用新的SQL和新参数的同一个对象。不幸的是,当我设置新的SQL并声明新的参数时,我得到一个异常。不止一次执行StoredProcedure
是否有可能通过“generify”类来执行多个带有新参数的SQL? 在我具体的例子不止一个问题
代码
package procedures;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.StoredProcedure;
import javax.sql.DataSource;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
public class MyProcedure extends StoredProcedure {
private static String SQL = "hr.get_size";
public MyProcedure(DataSource dataSource) {
super(dataSource, SQL);
declareParameter(new SqlOutParameter("param_out", Types.NUMERIC));
declareParameter(new SqlParameter("param_in", Types.VARCHAR));
setFunction(true);
compile();
}
public Object execute(String tableName) {
Map in = new HashMap();
in.put("param_in", tableName);
Map out = execute(in);
if (!out.isEmpty()) {
return out.get("param_out");
} else {
return null;
}
}
}
这引起了该呼叫例外:
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
MyProcedure myProcedure = applicationContext.getBean(MyProcedure.class);
System.out.println(myProcedure.execute("employees"));
myProcedure.setSql("hr.get_all_tables");
myProcedure.declareParameter(new SqlOutParameter("param_out", Types.VARCHAR));
myProcedure.setFunction(true);
myProcedure.compile();
System.out.println(myProcedure.execute());
}
例外:
Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: Cannot add parameters once the query is compiled
at org.springframework.jdbc.object.RdbmsOperation.declareParameter(RdbmsOperation.java:278)
at org.springframework.jdbc.object.StoredProcedure.declareParameter(StoredProcedure.java:99)
at main.Main.main(Main.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
'StoredProcedure'类是抽象类 - 我不能创建它的一个实例。 – ashur 2015-03-13 18:38:14
我添加了一个创建匿名类的例子。但最后,你将不得不为每个过程创建一个新的'StoredProcedure'对象。我不会浪费时间试图找到避免这样做的方法。 – rghome 2015-03-16 09:39:01