这是我的情况: 我有以下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})
答案 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);