Как выполнить скрипт PL / pgSQL в бине Spring? - PullRequest
1 голос
/ 28 июня 2019

У меня есть приложение Spring, и при каждом запуске мне нужно проверять существование таблицы.Вот так

@PostConstruct
    public void init() {

        DataSource auditDataSource = DataSourceBuilder.create().url(url).driverClassName(driver).username(username).password(password).build();
        this.jdbcTemplate = new NamedParameterJdbcTemplate(auditDataSource);

        Resource initSchema = new ClassPathResource("audit-data.sql");
        DatabasePopulator databasePopulator = new ResourceDatabasePopulator(initSchema);
        try {
            DatabasePopulatorUtils.execute(databasePopulator, auditDataSource);
        } catch (ScriptException e) {
        }
    } 

При каждом запуске мне нужно запустить скрипт PL SQLэтот скрипт в POSTGRES pgAdmin 4. И все хорошо.Но когда я пытаюсь запустить свое приложение - я получаю исключение выше.

1 Ответ

0 голосов
/ 01 июля 2019

Я решил эту проблему.Я поместил часть DO в запятые ' и заменил " на двойные запятые ''.Теперь все работает нормально.Я не уверен, что там важен тип IDE, но я использовал IDEA 2019.1.3 (не тестировался на Eclipse). Теперь приведенный выше код выглядит следующим образом

DO '
DECLARE
columns_count INTEGER;
table_exists BOOLEAN;
BEGIN
table_exists = (SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = ''public'' AND table_name = ''audit''));

IF (table_exists) THEN
columns_count = (SELECT COUNT(column_name)
FROM information_schema.columns
WHERE table_name=''audit'' and (
column_name=''entry_date'' or
column_name=''payload'' or
column_name=''uid'' or
column_name=''type'' or
column_name=''session_id'' or
column_name=''user_uid'' or
column_name=''username''));
END IF;

IF (table_exists = false) OR (columns_count != 7) THEN
DROP TABLE IF EXISTS public.audit;
CREATE TABLE public.audit (
    entry_date timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
    payload text,
    uid character varying(36),
    type character varying(1),
    session_id character varying(128),
    user_uid character varying(36),
    username character varying(1024)
);

ALTER TABLE public.audit OWNER TO postgres;
END IF;

END';
...