You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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结束符/

  1. 在测试类的@Sql注解中添加@SqlConfig,指定分隔符为/,同时设置注释前缀避免误解析:
    @SpringBootTest
    @Sql(scripts = "classpath:your-trigger-script.sql", 
         config = @SqlConfig(separator = "/", commentPrefix = "--"))
    public class FooTest {
        // 测试用例代码
    }
    
  2. 修改你的触发器脚本,在末尾添加/(这是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:57:09