9

这个问题是参考问题“如何使用 H2 数据库创建存储过程?” (同一问题的继续)。

有没有办法在不使用 Java 代码的情况下在 H2 中编写函数?我的要求是将用 SQL 编写的函数翻译成 H2 而不使用 Java 代码。我在不同的门户网站上发现了很多使用 Java 代码做同样事情的例子。对你的帮助表示感谢。

问候阿伦

4

2 回答 2

17

目前,H2 仅支持用 Java 或相关语言(例如 Groovy 或 Scala)编写的函数。不支持PL/SQL (Oracle)T-SQL(MS SQL Server、Sybase)

于 2013-06-25T11:18:33.187 回答
4

如果您的主要目标是在您的 H2 Java 用户定义函数中运行 SQL(或 SQLesque)语句,则 jOOQ可以作为“PL/Java”实现的一个选项。当然,这仍然是一个 Java 解决方案。

可以在此博客文章中看到此类功能的示例:

http://blog.jooq.org/2011/11/04/use-jooq-inside-your-h2-database

public class Functions {
    public static int countBooks(Connection connection, Integer authorId) 
    throws SQLException {
        // Translate your T-SQL statements to jOOQ statements
        return DSL.using(connection, SQLDialect.H2)
                  .selectCount()
                  .from(BOOK)
                  .where(BOOK.AUTHOR_ID.eq(authorId))
                  .fetchOne(0, int.class);
    }
}

将上述方法声明为 H2 的 ALIAS

CREATE ALIAS countBooks 
   FOR "org.example.Functions.countBooks";

在 SQL 中使用函数

SELECT author.last_name, countBooks(author.id) 
FROM author

当然,H2 自己的 SQL 抽象JaQu也可以采用类似的方法。我认为使用 JaQu 不会增加任何额外的依赖。

于 2013-06-25T11:35:38.597 回答