首页 > 解决方案 > 使用 Java 对象列表调用 Oracle 过程,作为 Spring Boot 的参数

问题描述

所以我们有一个要求,我们需要通过使用 Spring Boot 传递 Java 对象的自定义列表作为参数来调用 Oracle 存储过程,我做了一些研究,但无法正确实现它,Spring Boot 的初学者,所以任何帮助和参考实现会有很大帮助。

我们需要做的是创建一个微服务,它会从 mongo dB 转换中获取一些记录,然后加载到 Oracle dB,但是调用将是一个 Oracle 存储过程,我们能够完成所有 mongo 部分和 Oracle 连接和使用简单的 in 参数调用 Oracle 存储过程,但我们的要求是通过传递 Java 对象类型列表来调用此存储过程。那就是我们卡住的地方

标签: springspring-bootjpaplsqlspring-data-jpa

解决方案


1)创建一个数据库配置bean类,您可以在其中存储所有与数据库(Oracle)相关的属性

数据库配置类

@Configuration
public class DataBaseConfig {
  private static final Log LOGGER = LogFactory.getLog(DataBaseConfig.class);
  @Autowired
  private Environment environment;
  @Bean(name = "jdbcTemplate")
  public JdbcTemplate jdbcTemplate() throws SQLException {
  OracleDataSource dataSource = new OracleDataSource();

  String url = environment.getProperty("spring.db.jdbc.url");
  String userName = environment.getProperty("spring.db.username");
  String password = environment.getProperty("spring.db.password");
  String driver = environment.getProperty("spring.db.driver-classname");

  dataSource.setUser(userName);
  dataSource.setPassword(password);
  dataSource.setURL(url);
  dataSource.setDriverType(driver);
  return new JdbcTemplate(dataSource);
   }
 }

2) 调用存储过程的方法有很多种。最好的方法之一是使用简单的 jdbc 调用

服务类

public class getOrders(ApprovalAction approvalActionObj){

  List<Orders> orderList= approvalActionObj.getApprovalQsType();

  SimpleJdbcCall jdbcCall = new 
  SimpleJdbcCall(jdbcTemplate).withProcedureName("XX_PROCEDURE")
 .withCatalogName("XX_PACKAGE").withoutProcedureColumnMetaDataAccess()
 .declareParameters(
  new SqlParameter("P_ORDER_ROLLUP", Types.ARRAY,"ALG_ORDER_TAB"),
  new SqlOutParameter("O_ERROR_MESSAGE", Types.NUMBER));


  Object[][] orderArray = new Object[ordersList.size()][2];   

  for(int actionIndex = 0; actionIndex < ordersList.size(); actionIndex++) 
  {

  ordersArray[actionIndex][0] = orderList.get(actionIndex).getId();
  ordersArray[actionIndex][1] = orderList.get(actionIndex).getType();
  }
  Map<String, Object> orderResult=jdbcCall.execute(new 
  MapSqlParameterSource().addValue("P_ORDER_ROLLUP", new 
  SqlArrayValue(orderArray)));

  Integer errorMsg = (String) orderResult.get("O_ERROR_MESSAGE"); 
  }

注意:在您的情况下,您可以将所有自定义对象作为数组传递。


推荐阅读