问题描述
我一直在尝试为我的应用程序编写一些单元测试。我在 docker 容器中使用 oracle 数据库。
我使用 ScriptUtils.executesqlScript()
从 sql 文件初始化数据库。如果我使用的是 MysqL 数据库,但我的 Oracle 模式中有 PL/sql,并且在执行模式时出现异常(我 100% 确定模式有效),则这项工作有效。
END; nested exception is java.sql.sqlSyntaxErrorException: ORA-00900: invalid sql statement
我猜 ScriptUtils.executesqlScript()
不支持 PL/sql。
由于我不想在 docker-compose.yml 中进行卷绑定,因此在启动 docker 容器时无法初始化表。
@SpringBoottest
public class JdbcUserDaoImpltest {
private static JdbcUserDaoImpl userDao;
private User user;
@BeforeClass
public static void init() throws sqlException {
userDao = new MysqljdbcUserDaoImpl(dataSource());
ScriptUtils.executesqlScript(Objects.requireNonNull(userDao.getDataSource()).getConnection(),new ClassPathResource("pre.schema.sql"));
ScriptUtils.executesqlScript(userDao.getDataSource().getConnection(),new ClassPathResource("schema.sql"));
}
... TEST CASES ...
public static DataSource dataSource() {
DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("oracle.jdbc.OracleDriver");
dataSourceBuilder.url("jdbc:oracle:thin:@127.0.0.1:1507:XE");
dataSourceBuilder.username("system");
dataSourceBuilder.password("oracle");
return dataSourceBuilder.build();
}
@AfterClass
public static void destroy() throws sqlException {
ScriptUtils.executesqlScript(Objects.requireNonNull(userDao.getDataSource()).getConnection(),new ClassPathResource("drop.sql"));
}
}
编辑
不可部署的 sql 示例
CREATE TRIGGER item_trigger
BEFORE INSERT
ON items
FOR EACH ROW
BEGIN
IF :NEW.item_date IS NULL
THEN
SELECT CURRENT_TIMESTAMP INTO :NEW.item_date FROM DUAL;
END IF;
IF :NEW.item_uid IS NULL
THEN
SELECT SYS_GUID() INTO :NEW.item_uid FROM DUAL;
END IF;
END;
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)