Я использую Spring и JDBC для вставки в базу данных Oracle с помощью NamedParameterJdbcOperations. У меня возникла ошибка, когда я попытался написать тестовый пример для этой операции, используя jMock и базу данных h2 в памяти.
CREATE TABLE DIM_ATTRIBUTE
(
ATTRIBUTE_ID VARCHAR2(45) NOT NULL,
ATTRIBUTE_NAME VARCHAR2(100) NOT NULL,
ATTRIBUTE_VALUE VARCHAR2(100) NOT NULL,
CREATE_TIMESTAMP TIMESTAMP(6) DEFAULT
SYSTIMESTAMP NOT NULL,
UPDATE_TIMESTAMP TIMESTAMP(6) DEFAULT
SYSTIMESTAMP NOT NULL
);
Мой запрос для вставки с помощью Spring:
INSERT INTO DIM_ATTRIBUTE(ATTRIBUTE_ID,ATTRIBUTE_NAME,CREATE_TIMESTAMP,
UPDATE_TIMESTAMP) VALUES('ATTR'||to_char(ATTRIBUTE_ID_SEQ.nextval,'
'FM000000000'),:attributeName,SYSTIMESTAMP,SYSTIMESTAMP)
Класс Spring Java DAO:
public boolean addAttribute(AttributeRequest attributeRequest) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("attributeName", attributeRequest.getAttributeName());
int rowsAffected = jdbcOperations.update(DBQueries.INSERT_DIM_ATTRIBUTE, paramMap);
if (rowsAffected == 0) {
return false;
}
return true;
}
jMock класс:
public class AttributeDaoImplTest {
@Configuration
static class SpringConfiguration {
@Bean
public FactoryBean<DataSource> dataSource() {
return new InMemoryDatabaseFactoryBean("db/schema.sql", "dao/attribute/AttributeDaoImplTest-data.sql");
}
@Bean
public AttributeDao attributeDao(DataSource dataSource) {
return new AttributeDaoImpl(dataSource);
}
@Bean
public NamedParameterJdbcOperations jdbcOperations(DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
}
@Resource
private AttributeDao dao;
@Resource
private NamedParameterJdbcOperations jdbcOperations;
@Test
public void addAttribute() {
AttributeRequest attributeRequest=new AttributeRequest("test");
dao.addAttribute(attributeRequest);
}
}
Трассировки стека:
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [INSERT INTO DIM_ATTRIBUTE(ATTRIBUTE_ID,ATTRIBUTE_NAME,CREATE_TIMESTAMP,UPDATE_TIMESTAMP) VALUES ('ATTR'||to_char(ATTRIBUTE_ID_SEQ.nextval,'FM000000000'),?,SYSTIMESTAMP,SYSTIMESTAMP)]; nested exception is org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "INSERT INTO DIM_ATTRIBUTE(ATTRIBUTE_ID,ATTRIBUTE_NAME,CREATE_TIMESTAMP,UPDATE_TIMESTAMP) VALUES ('ATTR'||TO_CHAR(ATTRIBUTE_ID_SEQ.NEXTVAL,[*]'FM000000000'),?,SYSTIMESTAMP,SYSTIMESTAMP) "; expected "identifier"; SQL statement:
Даже после использования метки времени он не принимается из-за символа вертикальной черты





В базе данных H2 нет функции «SYSTIMESTAMP», поскольку она специфична для Oracle. Вместо этого ваши тесты должны просто использовать базу данных DEV Oracle.