Spring Boot Test执行Oracle触发器脚本报PLS-00103错误求助
问题排查与解决
问题根源
Spring的@Sql注解默认以分号;作为SQL语句的分隔符,但你的Oracle触发器属于PL/SQL块,内部包含多个分号。这会导致注解错误地将触发器脚本拆分成不完整的片段,只执行了BEGIN SELECT FOO_SEQUENCE.NEXTVAL INTO nextval FROM dual这部分,缺少后续的分号和代码,因此触发ORA-06550语法错误。
而SQL Developer能正常执行是因为它能识别PL/SQL块的结构,不会把块内的分号当作语句结束符,直到遇到/才会执行整个块。
解决方案
方法1:修改@Sql配置,使用Oracle标准的PL/SQL结束符/
- 在测试类的
@Sql注解中添加@SqlConfig,指定分隔符为/,同时设置注释前缀避免误解析:@SpringBootTest @Sql(scripts = "classpath:your-trigger-script.sql", config = @SqlConfig(separator = "/", commentPrefix = "--")) public class FooTest { // 测试用例代码 } - 修改你的触发器脚本,在末尾添加
/(这是Oracle中执行PL/SQL块的标准结束符):CREATE OR REPLACE TRIGGER SA."TRIGGER" BEFORE INSERT ON "SA"."FOO" FOR EACH ROW DECLARE nextval NUMBER; BEGIN SELECT FOO_SEQUENCE.NEXTVAL INTO nextval FROM dual; :new.ID_FOO := nextval; END; /
方法2:手动执行脚本(备选)
如果不想修改脚本结构,可以通过ScriptUtils手动执行,自定义分割规则:
@SpringBootTest public class FooTest { @Autowired private DataSource dataSource; @BeforeEach void setupTrigger() throws Exception { Resource resource = new ClassPathResource("your-trigger-script.sql"); // 参数依次:是否继续执行错误脚本、是否忽略失败、注释前缀、语句分隔符、块内分隔符、行分隔符 ScriptUtils.executeSqlScript(dataSource.getConnection(), resource, false, true, "--", "/", ";", "\n"); } }
内容的提问来源于stack exchange,提问作者Thomarkey
相关产品推荐
相关产品推荐

