从JdbcTemplate正确评估物化视图中的占位符

时间:2018-06-13 07:55:50

标签: spring oracle spring-boot

这是我的情况: 我有以下sql文件(my_view.sql - 包含物化视图的定义,Oracle方言)返回所有具有expire_date>的产品。 SYSDATE:

CREATE MATERIALIZED VIEW my_view
BUILD DEFERRED
REFRESH COMPLETE ON DEMAND
 AS
SELECT *
FROM product
WHERE expire_date > sysdate

现在在应用程序代码中我使用这个视图有一个Spring Service:

@Service
public class MyService {
  private final JdbcTemplate jdbcTemplate;

  @Value("${expire_date}")
  private String expireDate;// property will be injected at runtime by Spring, but how to pass this string to be evaluated in the sql script through jdbcTemplate

  public MyService(JdbcTemplate jdbcTemplate) {
     this.jdbcTemplate = jdbcTemplate;
  }

  public void callMaterialisedView() {
    try (Connection zs1DbConnection = 
      jdbcTemplate.getDataSource().getConnection()) {
       jdbcTemplate.execute("BEGIN dbms_mview.refresh('my_view', 'c');END;");
    }
  }
}

我的问题:是否可以将 expire_date 配置为可用,并将其作为占位符从应用程序代码传递给sql脚本?

使其可配置很容易 - 我可以使用Spring @Value注释为我的应用程序代码注入一个具体的值。我想念的是如何(如果可能的话)将此值从 jdbcTemplate 传递给要正确评估的脚本。

在最后一个版本中,我想象看起来的剧本( expire_date jdbcTempalte 传递):

CREATE MATERIALIZED VIEW my_view
BUILD DEFERRED
REFRESH COMPLETE ON DEMAND
 AS
SELECT *
FROM product
WHERE expire_date > to_date(${expire_date})

1 个答案:

答案 0 :(得分:2)

物化视图不接受参数,但您可以创建一个包含一列的虚拟表,并在表中插入/更新参数值。

这是另一种解决方案。

在MV SQL中,您可以编写类似“where expire_date > (select dt_col from dummy_tab)”的内容,如下所示:

CREATE MATERIALIZED VIEW my_view
BUILD DEFERRED
REFRESH COMPLETE ON DEMAND
 AS
SELECT *
FROM product
WHERE expire_date > (select dt_col from dummy_tab);