Тщательно оцените заполнители в материализованном виде из JdbcTemplate - PullRequest
0 голосов
/ 13 июня 2018

Вот мой случай: у меня есть следующий файл 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 настраиваемым и передать его из кода приложения в качестве заполнителя в sqlscript?

Сделать его легко настраиваемым - я могу использовать аннотацию 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 голосов
/ 13 июня 2018

Материализованное представление не принимает параметр, но вы можете создать фиктивную таблицу с одним столбцом и вставить / обновить значение вашего параметра в таблице.

Это альтернативное решение.

InMV 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...