如何从java调用pl/pgsql
我的PL/pgSQL函数工作正常。我测试过了如何从java调用pl/pgsql,java,postgresql,spring-boot,plpgsql,Java,Postgresql,Spring Boot,Plpgsql,我的PL/pgSQL函数工作正常。我测试过了 CREATE OR REPLACE FUNCTION topAlerte() RETURNS void AS $$ DECLARE max_var_risk varchar(70); max_mvar_risk varchar(70); max_incvar_risk varchar(70);
CREATE OR REPLACE FUNCTION topAlerte()
RETURNS void AS
$$
DECLARE
max_var_risk varchar(70);
max_mvar_risk varchar(70);
max_incvar_risk varchar(70);
max_cvar_risk varchar(70);
amount varchar(70);
delta varchar(70);
net_exposure varchar(70);
BEGIN
truncate tops;
select names from risk where risk.var_mc_risk =(select max(risk.var_mc_risk) from risk) into max_var_risk ;
select names from risk where risk.mvar_mc_risk =(select max(risk.mvar_mc_risk) from risk) into max_mvar_risk ;
select names from risk where risk.inc_var_mc_risk =(select max(risk.inc_var_mc_risk) from risk) into max_incvar_risk ;
select names from risk where risk.cvar_mc_risk =(select max(risk.cvar_mc_risk) from risk) into max_cvar_risk ;
select names from risk where risk.amount =(select max(risk.amount) from risk) into amount ;
select names from risk where risk.delta =(select max(risk.delta) from risk) into delta;
select names from risk where risk.net_exposure =(select max(risk.net_exposure) from risk) into net_exposure ;
INSERT INTO tops VALUES
(max_var_risk, max_mvar_risk, max_incvar_risk, max_cvar_risk,amount,delta,net_exposure);
END ;
$$
LANGUAGE 'plpgsql';
我想从spring boot调用它,这是我的DAO:
public interface TopRepository {
public List getTopsAlert()throws Throwable;
}
以下是我的服务(接口实现):
该列表显示最大值的名称,因此必须包含表“tops”的值
使用:mvn spring boot:run运行服务器时
日志显示异常:
存储库中的字段
com.Friendly_road.Flight.controller.topController需要一个
键入'com.Friendly_road.Flight.dao.TopRepository',该选项不能为空
找到了
这种在DAO中使用存储过程的方式是某种“手工制作”的,是危险的。您实现的配置步骤是在每次方法调用时完成的,并且非常容易出错。它甚至不再是可配置的,与数据库配置等相关 文本中说您正在使用Spring Boot,那么为什么不使用
DataSourceAutoConfiguration
并在application.properties/application.yml文件中维护您的数据库配置呢?通过这种方式,您可以让Spring管理您的数据源。这将简化事务处理和使用连接池,而且更加方便
这是一个很好的例子
除此之外,如果您使用SpringDataJPA存储库接口,就不需要自己实现过程调用。您的存储过程调用可以通过以下方式轻松实现(假设您有类似于Top实体的东西):
@存储库
公共接口TopRepository扩展了Crudepository{
...
@程序(procedureName=“topAlerte”)
列出getTopAlerte();
...
}
这不是PostgreSQL问题,而是Spring问题。我不是spring用户,所以我只能猜测您的类需要一个@Repository
注释TopAlertMetier
。有关批注的更多信息,请参阅。我已修复了它,但它丢失了@Component@MBennani很高兴我能帮忙
public class TopAlertMetier implements TopRepository{
@Override
public List getTopsAlert() throws Throwable {
List<String> myList= new ArrayList<>();
Class.forName("org.postgresql.Driver");
Connection connect= null;
connect = (Connection) DriverManager.getConnection("jdbc:postgresql://localhost:5432/bourse","postgres","123456");
java.sql.CallableStatement proc = connect.prepareCall("{topAlerte()}");
proc.registerOutParameter(1, java.sql.Types.VARCHAR);
proc.executeQuery();
ResultSet results = (ResultSet) proc.getObject(1);
myList.add(results.getString(0));
myList.add(results.getString(1));
myList.add(results.getString(2));
myList.add(results.getString(3));
myList.add(results.getString(4));
myList.add(results.getString(5));
myList.add(results.getString(6));
return myList;
}
@RestController
public class topController {
@Autowired
TopRepository topRepository;
@RequestMapping(value="/alert",method = RequestMethod.GET)
public @ResponseBody List alert() throws Throwable{
return topRepository.getTopsAlert();
}
@Repository
public interface TopRepository extends CrudRepository<Top, Long> {
...
@Procedure(procedureName = "topAlerte")
List getTopAlerte();
...
}