创建具有相同名称但不同签名的别名
Posted
技术标签:
【中文标题】创建具有相同名称但不同签名的别名【英文标题】:create alias with the same name but not the same signature 【发布时间】:2014-01-31 16:18:42 【问题描述】:为了在我们的 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 值) 返回 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) throws 例外 ... $$;
在这种情况下,没有错误,但只考虑声明的最触发方法。
那么,有没有办法声明两个具有相同名称但不同签名的别名?
【问题讨论】:
【参考方案1】:至于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 方法必须有不同数量的参数。将函数声明为源代码时不支持方法重载。
【讨论】:
“多个方法可能绑定到一个 SQL 函数”,所以我希望有类似 CREATE ALIAS YOUR_METHOD FOR "acme.Function.yourMethod","acme.Function.yourMethodOverload1"; Java 支持方法重载,所以我认为您不需要传递两个 Java 方法。也许最好问一个新问题。 在 java 中,您可以使用相同数量的参数重载,例如foo(int a, int b)
和 foo(String a, String b)
。 H2 似乎不支持这一点,也不支持 foo(Object a, Object b)
。然而,H2 确实有一个可用于此的“值”类。以上是关于创建具有相同名称但不同签名的别名的主要内容,如果未能解决你的问题,请参考以下文章