Spring 正确评估JdbcTemplate中的实体化视图中的占位符

Spring 正确评估JdbcTemplate中的实体化视图中的占位符,spring,oracle,spring-boot,Spring,Oracle,Spring Boot,我的情况如下: 我有以下sql文件my_view.sql-包含实体化视图的定义,Oracle方言返回所有过期的产品\u date>sysdate: CREATE MATERIALIZED VIEW my_view BUILD DEFERRED REFRESH COMPLETE ON DEMAND AS SELECT * FROM product WHERE expire_date > sysdate 现在,在应用程序代码中,我有一个使用此视图的Spring服务: @Service pu

我的情况如下: 我有以下sql文件my_view.sql-包含实体化视图的定义,Oracle方言返回所有过期的产品\u date>sysdate:

CREATE MATERIALIZED VIEW my_view
BUILD DEFERRED
REFRESH COMPLETE ON DEMAND
 AS
SELECT *
FROM product
WHERE expire_date > sysdate
现在,在应用程序代码中,我有一个使用此视图的Spring服务:

@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传递到要正确计算的脚本

在最后一个变体中,我设想脚本看起来像是从jdbcTempalte传递的过期日期:


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

这是另一种解决办法

在MV SQL中,您可以编写类似于where expire\u date>从dummy\u选项卡中选择dt\u col的内容,如下所示:

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

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

这是另一种解决办法

在MV SQL中,您可以编写类似于where expire\u date>从dummy\u选项卡中选择dt\u col的内容,如下所示:

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

因此,在刷新MV之前,必须更新表值。在刷新MV之前,必须更新表值