H2 删除并创建别名 to_char 不起作用

Posted

技术标签:

【中文标题】H2 删除并创建别名 to_char 不起作用【英文标题】:H2 drop and create alias to_char not working 【发布时间】:2019-10-09 17:09:05 【问题描述】:

我一直在尝试运行一些单元测试,这些单元测试使用适用于我们的 oracle 数据库的 to_char 函数,但对于我们用于测试的内存数据库中的 h2 似乎不起作用。 我尝试删除别名 to_char 并将其覆盖为一个有效的别名,但是当我尝试删除别名 to_char 并创建它时,它似乎不起作用。

DROP alias if exists TO_CHAR;
CREATE alias TO_CHAR FOR "package.TEST.toChar";

导致:“org.h2.jdbc.JdbcSQLException:函数别名“TO_CHAR”已存在;SQL 语句:”

DROP alias TO_CHAR;
CREATE alias TO_CHAR FOR "package.TEST.toChar";

导致:“org.h2.jdbc.JdbcSQLException:找不到函数别名“TO_CHAR”;SQL 语句:”。

也尝试了如下的直接sql脚本,但不起作用:

DROP alias if exists TO_CHAR;
CREATE alias TO_CHAR as '
public static String toChar(String date, String pattern) throws Exception 
        pattern = pattern.replaceAll("YY","yy");
        pattern = pattern.replaceAll("DD","dd");
        pattern = pattern.replaceAll("HH24|hh24","HH");
        pattern = pattern.replaceAll("HH?!24|hh?!24","KK");
        pattern = pattern.replaceAll("MON|mon","MMM");
        pattern = pattern.replaceAll("MI|mi","mm");
        pattern = pattern.replaceAll("SS|ss","ss");
        pattern = pattern.replaceAll("AM|PM","aa");
        pattern = pattern.replaceAll("T","");
        SimpleDateFormat sm = new SimpleDateFormat(pattern);
        java.util.Date dt;
        if(date.length() > 10)dt = java.sql.Timestamp.valueOf(date);
        else
            dt = java.sql.Date.valueOf(date);
        return sm.format(dt);
    ';

我认为这可能是缺少权限,但它不适用于 user="sa",还查了一下,他们可能不允许覆盖 to_char 函数,因为有人说他们不允许覆盖某些函数: http://h2-database.66688.n3.nabble.com/trunc-alias-is-read-only-and-avoids-emulating-Oracle-trunc-function-td4025947.html

有人知道我在这里缺少什么或者无法覆盖它吗?

【问题讨论】:

【参考方案1】:

如果您真的想用自己的实现重新定义该函数,则需要将;BUILTIN_ALIAS_OVERRIDE=1 添加到您的数据库 URL。

【讨论】:

这行得通,必须将我的 h2 版本更新到 1.4.199 但它绝对行得通,非常感谢!对于任何想知道必须使用此方法的人: DROP alias TO_CHAR; CREATE alias TO_CHAR FOR "package.TEST.toChar";然后在我的 java 测试类中创建该方法,由于某种原因,他不会在 sql 文件中使用 create 中的代码,即使我认为应该这样做

以上是关于H2 删除并创建别名 to_char 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

H2 控制台和 Spring Security - permitAll() 不起作用

h2数据库to_char别名抛出空指针

.bash_profile中定义的别名在OS X中不起作用

将 Drush 8 升级到 9 站点别名不起作用

为啥保留重复记录时h2复合主键不起作用?

生成 forIndexName 的 Liquibase 差异在 h2 上不起作用