ScriptUtils.readScript() 与 DEFAULT_STATEMENT_SEPARATOR 不工作

ScriptUtils.readScript() with DEFAULT_STATEMENT_SEPARATOR is not working

我正在尝试使用 ScriptUtils.readScript 方法从文件执行 sql 脚本:

sql = ScriptUtils.readScript(fileReader,
                            ScriptUtils.DEFAULT_COMMENT_PREFIX,
                            ScriptUtils.DEFAULT_STATEMENT_SEPARATOR);

getJdbcTemplate().update(sql);

但是我收到错误 org.springframework.jdbc.BadSqlGrammarException: StatementCallback;错误的 SQL 语法 并且从日志中我看到 sql 语句中的分号 * 没有被忽略,即使我正在使用 ScriptUtils.DEFAULT_STATEMENT_SEPARATOR 为什么它不起作用?这里有什么问题?

编辑:我知道我可以通过使用解决这个问题:

getJdbcTemplate().update(sql.replace(";", ""));

但也许还有其他解决方案?

Edit2:这是我需要执行的 sql 示例:

INSERT
INTO MYTABLE
  (
    ID,
    MYNUMBER,
    MYVALUE
  )
 SELECT 
  ID,
  0,
  B.MYVALUE
 FROM ATABLE A,
  BTABLE B
  WHERE A.ID   = B.ID
 AND NOT EXISTS
  (SELECT 1 FROM MYTABLE M WHERE M.ID = A.ID
  );

我认为您 ScriptUtils.readScript 的使用方式不正确。 javadocs 自己声明:

Mainly for internal use within the framework.

查看 source code,似乎这个函数所做的只是将文件中的所有行加载到单个字符串中,并带有一些围绕注释的逻辑。此方法中分隔符的使用很少,只有在分隔符末尾有空格时才有意义。

如果您想忽略分隔符,则需要按照您建议的方式将其删除(使用 replace)。