【问题标题】:Spring DataSourceInitializer splits trigger ins sql by ; delimiterSpring DataSourceInitializer 将 sql 中的触发器拆分为 ;分隔符
【发布时间】:2010-09-22 11:40:18
【问题描述】:

我们使用 org.springframework.batch.test.DataSourceInitializer 类来基于 .sql 脚本初始化数据库。

在将触发器添加到 .sql 后,初始化失败。

经过调试,发现while出错的原因在这里:

try {
scripts = StringUtils.delimitedListToStringArray(stripComments(IOUtils.readLines(scriptResource.getInputStream())), ";");
}

出现这个错误,因为分隔符是";"符号,所以触发器在";"的基础上被拆分成几个部分,处理不当。

你能告诉我更高级的数据源初始化器,它可以正确理解触发器吗?

谢谢。

【问题讨论】:

  • 声明 ROWFOUND 布尔值;是不必要的,但不应破坏触发器
  • a 没有更改语句或其他,但据我从其他讨论中了解到,它似乎应该使用“立即执行”

标签: sql spring datasource delimiter initializer


【解决方案1】:

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; 

【讨论】:

  • 分隔符必须是'/',而不是';' - 甲骨文可以使用;作为 SQL 语句的分隔符,但不是 PL/SQL 块。
【解决方案2】:

已通过编写自己的 DataSourceInitilaizer 来解决,它处理 ';'取决于触发与否

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2021-04-27
    相关资源
    最近更新 更多