Hibernate 创建函数-UncategorizedScriptException-ArrayIndexOutOfBoundsException 描述

Hibernate 创建函数-UncategorizedScriptException-ArrayIndexOutOfBoundsException 描述,hibernate,postgresql,function,spring-boot,Hibernate,Postgresql,Function,Spring Boot,我是一个Spring Boot项目的新成员,该项目利用两个不同的属性文件,用于与DB设置相关的两种不同配置: 生产模式:postgres SQL DB 开发模式:h2内存数据库 由于我试图最小化这两个脚本中的差异,所以我已经开始编写函数来处理与日期/时间处理相关的差异 一个例子是增加小时数,因为postgres使用时间间隔,h2使用oracle类似的date\u add功能 不幸的是,对于在控制台中工作的函数创建语句,我遇到了一个异常 现有文件 配置/属性 spring.profiles.a

我是一个Spring Boot项目的新成员,该项目利用两个不同的属性文件,用于与DB设置相关的两种不同配置:

  • 生产模式:postgres SQL DB
  • 开发模式:h2内存数据库
由于我试图最小化这两个脚本中的差异,所以我已经开始编写函数来处理与日期/时间处理相关的差异

一个例子是增加小时数,因为postgres使用时间间隔,h2使用oracle类似的
date\u add
功能

不幸的是,对于在控制台中工作的函数创建语句,我遇到了一个异常

现有文件 配置/属性

spring.profiles.active=pre-prod

spring.datasource.url=jdbc:postgresql://localhost:5432/db
spring.datasource.username=postgres
spring.datasource.password=root
spring.datasource.driver-class-name=org.postgresql.Driver

spring.datasource.data=classpath:db/migration/postgres/db_functions.sql,classpath:db/migration/postgres/data.sql
spring.jpa.hibernate.ddl-auto=create
db_函数.sql

--Adds a cast to date to the specific statement
--for h2 simply make a wrapper
CREATE OR REPLACE FUNCTION db_pgres_cast_varchar_to_date(d VARCHAR ) RETURNS date AS $$
        BEGIN
                RETURN d::date;
        END;
$$ LANGUAGE plpgsql;

--Common function for h2 and vct to add hours
--References: http://stackoverflow.com/questions/9376350/postgresql-how-to-concat-interval-value-2-days
CREATE OR REPLACE FUNCTION db_add_hours(d timestamp, hours int) RETURNS timestamp AS $$
        BEGIN
                RETURN d +  (hours || ' hours')::interval;
        END;
$$ LANGUAGE plpgsql;
例外情况 更新 我开始调试,发现我的脚本被解释为6个SQL命令,而不是创建2条语句的拆分/解析器代码:

更新2 问题似乎在于
splitSqlScript
的实现,定义:

public static void splitSqlScript(EncodedResource resource, String script, String separator, String commentPrefix,
            String blockCommentStartDelimiter, String blockCommentEndDelimiter, List<String> statements)
            throws ScriptException

问题是spring的SplitSqlScript:

我通过更改create function语句的语法来避免
$
,并将SQL语句括在引号内,从而解决了这个问题

例如


我今天遇到了这个问题,试图加载一个包含存储过程的PostGreSQL转储文件。SP有;在街区内,没有办法“逃脱”这一点。通过将分隔符从更改为,我使ScriptUtils.executeSqlScript调用开始工作;为此:

我在参数中使用的常量可以通过以下方式导入:

import static org.springframework.jdbc.datasource.init.ScriptUtils.*;

确保您使用的是最新的PgJDBC,旧版本IIRC在引用时出现问题。你确定这是堆栈底部的异常吗?@Craig Ringer请查看更新。。。似乎解析器甚至在解释“;”作为分隔符。我还将检查问题是否出在
$
上。异常报告的是
vct\u函数.sql
,而不是
db\u函数.sql
。键入错误?@Tommaso Di Bucchianico不,我通常会更改代码中的内容名称,stackoverflow除外。SQL文件的名称不是问题所在,谢谢。@Craig Ringer
9.4-1200-jdbc4
有这个问题吗?
--Adds a cast to date to the specific statement
--for h2 simply a wrapper
CREATE OR REPLACE FUNCTION vct_pgres_cast_varchar_to_date(VARCHAR ) RETURNS date
    AS 'select $1::date;'
    LANGUAGE SQL
    RETURNS NULL ON NULL INPUT;


--Common function for h2 and vct to add hours
--References: http://stackoverflow.com/questions/9376350/postgresql-how-to-concat-interval-value-2-days

CREATE OR REPLACE FUNCTION vct_add_hours(timestamp, integer) RETURNS timestamp
    AS 'select $1 +  ($2 || '' hours'')::interval'
    LANGUAGE SQL
    RETURNS NULL ON NULL INPUT;
CREATE OR REPLACE FUNCTION vct_pgres_cast_varchar_to_date(VARCHAR ) RETURNS date
    AS 'select $1::date;'
    LANGUAGE SQL
    RETURNS NULL ON NULL INPUT;
ScriptUtils.executeSqlScript(dataSource.getConnection(), new EncodedResource(resourceLoader.getResource(String.format("file:%s%s", getCwd(), SCHEMA_SQL_FILE))), false, false, DEFAULT_COMMENT_PREFIX, EOF_STATEMENT_SEPARATOR, DEFAULT_BLOCK_COMMENT_START_DELIMITER, DEFAULT_BLOCK_COMMENT_END_DELIMITER);
import static org.springframework.jdbc.datasource.init.ScriptUtils.*;