这是我的情况: 我有以下sql文件(my_view.sql - 包含物化视图的定义,Oracle方言(返回所有具有expire_date>系统日期的产品:
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传递到脚本以进行正确评估。
在最后一个变体中,我想象脚本看起来像(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})
实例化视图不接受参数,但您可以创建一个包含一列的虚拟表,并在表中插入/更新参数值。
这是一种替代解决方案。
在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);