2012-07-30 149 views
5

我是數據庫新手,最近開始編寫H2數據庫的測試用例。 我想知道如何在Eclipse中測試存儲過程。我已經看到了以下情況:?H2數據庫中的存儲過程

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」?

謝謝。

+0

您是否閱讀過文檔?您發佈的語句是一條SQL語句,您需要使用JDBC API執行它。 – 2012-07-31 04:36:52

+0

我想知道如何使用API​​調用此方法。任何示例代碼引用都會有很大的幫助。該SQL部分應該在哪裏聲明?我明白,這可能是非常基本的,但我剛剛起步。謝謝 – Abi 2012-08-01 03:05:12

+0

在互聯網上有大量的示例代碼參考,並有大量的H2網站上的文檔。你只需要搜索和閱讀。我建議先學習關於JDBC和SQL的基礎知識。 – 2012-08-01 06:09:51

回答

6

您可能忽略了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

+0

Thanks @trashgod (+1) - * finally *,一個調用Java函數作爲別名的完整例子。 – smeeb 2016-02-23 09:25:59

+0

回顧一下,注意'cli.Function.query'是'org.h2.samples.Function.query '。 – trashgod 2016-02-23 12:36:11

6

有一個在H2數據庫中沒有存儲的過程和SQL用戶定義的函數,而不是我們用java方法並創建別名來引用that.We可以使用別名調用該方法。

下面是一個簡單的例子:**

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; 
} 
$$; 
+1

我想你忘了'rs.next()'。 – 2014-09-23 10:29:10

+0

@ThomasMueller H2仍然不支持存儲過程嗎?請看我在問題評論部分的最後一條評論。是對還是錯? – 2014-09-27 19:35:09

+1

@AbdulJabbarWebBestow H2始終支持存儲過程...也許你對存儲過程的定義與我的定義不一樣?你的定義是什麼?與Oracle完全兼容的東西?是的,H2與Oracle不是100%兼容。 – 2014-09-29 07:54:38

1
在H2數據庫

存儲過程是相同的如Java methods.So寫java方法和可以調用使用別名。