【问题标题】:Call Oracle procedure with list of Java object as in parameter from spring boot使用 Java 对象列表调用 Oracle 过程,作为 Spring Boot 的参数
【发布时间】:2019-05-01 03:33:30
【问题描述】:

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

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

【问题讨论】:

  • Spring Boot 是一个基于 Java 的开源框架,主要用于创建微服务。您的问题需要更多详细信息。您可以在此处阅读有关 Spring Boot 的更多信息。 spring.io/projects/spring-boot
  • 我不确定我缺少什么信息,但我们需要做的是创建一个微服务,该微服务将从 mongo dB 转换中获取一些记录,然后加载到 Oracle dB,但调用将是对于 Oracle 存储过程,我们能够完成所有 mongo 部分和 Oracle 连接,并使用简单的 in 参数调用 Oracle 存储过程,但我们的要求是通过传递 Java 对象类型列表来调用此存储过程。这就是我们卡住的地方

标签: spring spring-boot jpa plsql spring-data-jpa


【解决方案1】:

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"); 
  }

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

【讨论】:

    猜你喜欢
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多