创建具有相同名称但不同签名的别名

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 确实有一个可用于此的“值”类。

以上是关于创建具有相同名称但不同签名的别名的主要内容,如果未能解决你的问题,请参考以下文章

派生类中具有相同名称但不同签名的函数

为啥具有相同名称但不同签名的多个继承函数不会被视为重载函数?

C#中具有相同名称和签名但返回类型不同的方法

同时上传具有相同代码库但签名不同的两个版本的 apk

不同程序集,名称空间类名和方法签名都一样的方法,如何调用

在同一个类/结构中具有相同签名的相同函数?超载?