为了在我们的Junit测试中使用H2数据库而不是调用Oracle,我阻止在H2上创建别名以模拟某些Oracle兼容性:
我首先声明了to_char的别名,用于日期到字符的转换:工作正常
create alias TO_CHAR as $$ java.lang.String toChar(java.util.Date date, String format) throws Exception{ ... }$$;
然后我尝试为to_char声明一个别名,用于数字到字符的转换:现在h2不接受它:
create alias TO_CHAR as $$
java.lang.String toChar(java.lang.Number value){
...
}$$;
它被拒绝,并显示以下错误消息:
org.h2.jdbc.JdbcSQLException:函数别名“TO_CHAR”已存在; SQL语句: 创建别名TO_CHAR为$$
java.lang.String toChar(java.lang.Number value){ return java.lang.String .valueOf(value); } $$
我还尝试在1个块中声明2个函数,如:
将别名TO_CHAR创建为$$
java.lang.String toChar(int value){ ... }
java.lang.String toChar(java.util.Date date,String format)抛出 例外{ ... } $$;
在这种情况下,没有错误,但只考虑声明的firest方法。
那么,有没有办法声明2个具有相同名称但签名不同的别名?
答案 0 :(得分:2)
至于TO_CHAR
, H2 support it now,自version 1.3.175 (2013-01-18)。
H2确实支持function overloading。但是,存在一个限制,因为不支持声明诸如源代码之类的功能。
您需要按如下方式声明方法:
CREATE ALIAS YOUR_METHOD FOR "acme.Function.yourMethod";
此限制在User Defined Functions下记录如下:
如果类已经编译并包含在类路径中,则可以将多个方法绑定到SQL函数。每个Java方法必须具有不同数量的参数。将函数声明为源代码时,不支持方法重载。