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



这是我的情况: 我有以下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_datejdbcTempalte传递

(:
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);

最新更新