H2数据库中的存储过程

时间:2012-07-30 09:40:17

标签: java stored-procedures h2

我是数据库的新手,最近开始编写H2数据库的测试用例。 我想知道如何在Eclipse中测试存储过程。我见过以下内容:

http://www.h2database.com/html/features.html#user_defined_functions

How to CREATE PROCEDURE in H2

h2database链接中提供的示例代码

"CREATE ALIAS NEXT_PRIME AS $$
String nextPrime(String value) {
    return new BigInteger(value).nextProbablePrime().toString();
}
$$;
" 
  • 应该在哪里声明?以及如何运行它?

PS - 我有H2 JAR文件并正在测试它。

如果有人可以告诉我如何在Java中为H2编写一个简单的存储过程,那将会有很大的帮助。

H2中还有以下任何等价物吗?

“begin dbms_output”?

感谢。

5 个答案:

答案 0 :(得分:9)

您可能忽略了src/test/org/h2/samples/Function.java中的示例。这是一个相关的例子:

Connection conn = DriverManager.getConnection("jdbc:h2:mem:", "sa", "");
Statement st = conn.createStatement();
st.execute("CREATE ALIAS getVersion FOR \"org.h2.engine.Constants.getVersion\"");
ResultSet rs;
rs = st.executeQuery("CALL getVersion()");
if (rs.next()) System.out.println("Version: " + rs.getString(1));

控制台:Version: 1.4.191

附录:该功能不仅限于功能;别名方法可以执行任意Java code。例如,Function.java中定义的query()方法可能会被别名化并调用,如下所示:

Connection conn = DriverManager.getConnection("jdbc:h2:mem:", "sa", "");
Statement st = conn.createStatement();
st.execute("CREATE ALIAS query FOR \"cli.Function.query\"");
rs = st.executeQuery("CALL query('SELECT NAME FROM INFORMATION_SCHEMA.USERS')");
while (rs.next()) {
    System.out.println("User: " + rs.getString(1));
}

控制台:User: SA

请注意,cli.Function.queryorg.h2.samples.Function.query的副本。

答案 1 :(得分:9)

H2数据库中没有存储过程和sql用户定义函数,而不是我们使用java方法并创建别名来引用它。我们可以使用别名调用这些方法。

下面是一个简单的例子:**

DROP ALIAS IF EXISTS MYFUNCTION;
CREATE ALIAS MYFUNCTION AS $$
String getTableContent(java.sql.Connection con) throws Exception {
    String resultValue=null;
    java.sql.ResultSet rs = con.createStatement().executeQuery(
    " SELECT * FROM TABLE_NAME");
       while(rs.next())
       {
        resultValue=rs.getString(1);
       }
    return resultValue;
}
$$;

答案 2 :(得分:1)

H2数据库中的存储过程与java方法相同。所以编写java方法并使用别名调用。

答案 3 :(得分:1)

下面是我们过去在项目中实现的方式。可能会有所帮助:)

package com.procedures;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class CRITICAL_ACTIONS {

    public static final int SAVE_ACTION(Connection connection) throws SQLException {
        try {
            Statement statement = connection.createStatement();
            return statement.executeUpdate("INSERT INTO SCHEMA1.CRITICAL_ACTIONS(COLLEAGUE_ID,JOURNEY_ID,TYPE,PRODUCT,DESCRIPTION,META_DATA,STATUS) values('12345',11111111,'ABC','Lloyds','hellow','hello','START')");
        } finally {
            //connection.close();
        }
    }

    public static final ResultSet FETCH_ACTION(Connection connection) throws SQLException {
        try {
            Statement statement = connection.createStatement();
            return statement.executeQuery("SELECT * FROM SCHEMA1.CRITICAL_ACTIONS");
        }finally {
            connection.close();
        }
    }


}

在Java中调用H2 Java存储过程:-

    jdbcTemplate.update("CREATE ALIAS SAVE_ACTION FOR \"com.procedures.CRITICAL_ACTIONS.SAVE_ACTION\"");
    jdbcTemplate.update("CREATE ALIAS FETCH_ACTION FOR \"com.procedures.CRITICAL_ACTIONS.FETCH_ACTION\"");

    jdbcTemplate.getDataSource().getConnection().createStatement().execute("call SAVE_ACTION()");

答案 4 :(得分:0)

category