Spring DataSourceInitializer将触发器拆分为sql;分隔符
我们使用org.springframework.batch.test.DataSourceInitializer类,以便基于.sql脚本初始化数据库 触发器添加到.sql后,初始化失败 调试后,在此处找到了错误的原因:Spring DataSourceInitializer将触发器拆分为sql;分隔符,sql,spring,datasource,delimiter,initializer,Sql,Spring,Datasource,Delimiter,Initializer,我们使用org.springframework.batch.test.DataSourceInitializer类,以便基于.sql脚本初始化数据库 触发器添加到.sql后,初始化失败 调试后,在此处找到了错误的原因: try { scripts = StringUtils.delimitedListToStringArray(stripComments(IOUtils.readLines(scriptResource.getInputStream())), ";"); } 发生此错误,因为分
try {
scripts = StringUtils.delimitedListToStringArray(stripComments(IOUtils.readLines(scriptResource.getInputStream())), ";");
}
发生此错误,因为分隔符是“”;“符号,所以触发器被根据“”;“拆分为几个部分,并且处理不正确
你能告诉我更高级的数据源初始化器,它能正确理解触发器吗
谢谢。CREATE TRIGGER语句是PL/SQL块,PL/SQL块必须以一个
/
作为行的第一个字符终止。这应该起作用:
CREATE OR REPLACE TRIGGER "ACCOUNT_BIU"
BEFORE INSERT OR UPDATE ON ACCOUNT
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
IF (:NEW.ESKONTOTYPE_ID IS NULL) THEN
IF (:NEW.KONTOTYPE_ID ='NP') THEN
:NEW.ESKONTOTYPE_ID := 311;
ELSIF (:NEW.KONTOTYPE_ID ='MT') THEN
:NEW.ESKONTOTYPE_ID := 320;
ELSIF (:NEW.KONTOTYPE_ID ='NL') THEN
:NEW.ESKONTOTYPE_ID := 330;
END IF;
END IF;
:NEW.ENDRETBRUKER := SUBSTR(USER,1,7);
:NEW.ENDRETDATO := SYSDATE;
END;
/
ALTER TRIGGER "ACCOUNT_BIU" ENABLE;
通过编写自己的DataSourceInitializer解决了这个问题,它处理“;”取决于触发器与否声明ROWFOUND布尔值;是不必要的,但不应破坏触发器a没有更改或其他,但似乎应该使用“立即执行”,因为我从其他讨论中了解到,分隔符需要是“/”,而不是“;”-甲骨文可以使用;作为SQL语句的分隔符,而不是PL/SQL块。