Java DB中的Java存储过程
1 Java存儲過程
這篇文章是關于Java DB中的Java存儲過程的。
Java DB是基于Java編程語言和SQL的關系數據庫管理系統。 這是Apache軟件基金會的開源Derby項目的Oracle版本。 Java SE 7 SDK中包含Java DB。
在數據庫內調用的Java代碼是一個存儲過程(或多個過程)。 Java存儲過程是數據庫端JDBC(Java數據庫連接)例程。
過程代碼以Java類方法定義,并存儲在數據庫中。 這是使用SQL執行的。 該過程代碼可以帶有或不帶有任何與數據庫相關的代碼。
其他數據庫端(或服務器端)程序是觸發器和表函數。
1.1 Java過程類型
根據在其中調用存儲的事務,存儲過程有兩種類型:嵌套連接和非嵌套連接。
嵌套連接
這種過程使用與調用它的SQL語句相同的事務。 該過程代碼使用與父SQL相同的連接,并使用連接URL語法jdbc:default:connection 。 以下是獲得連接的示例代碼位:
Connection c = DriverManager.getConnection("jdbc:default:connection");請注意,此類型不支持連接URL屬性。
示例代碼位于: 2.1創建 。
非嵌套連接
這種類型的過程使用新的數據庫連接。 該過程是在與調用SQL不同的事務中執行的。
存儲過程代碼也可以連接到其他數據庫。
以下位置的示例代碼: 3.1使用非嵌套連接 。
1.2過程中的SQL異常
過程中的SQL異常可以在過程代碼中捕獲和處理,或在調用程序中傳播(捕獲)。
2創建和使用Java存儲過程
這描述了在Java DB數據庫中創建Java存儲過程以及在SQL和Java代碼中以交互方式使用它的過程。 使用Java編程語言創建存儲過程代碼。 該過程是帶有簽名的public static void procedureMethod方法中的Java代碼。 創建存儲過程并將其作為數據庫對象存儲在Java DB數據庫中。
使用SQL命令或使用JDBC API從Java程序調用(或調用)該過程。
2.1建立
創建一個Java方法,對其進行編譯,然后將該過程存儲在數據庫中。
2.1.1創建Java方法
以下是示例方法。
public static void testProc(int iParam1, String iParam2, int [] oParam)throws SQLException {String connectionURL = "jdbc:default:connection";Connection conn = DriverManager.getConnection(connectionURL);String DML = "UPDATE TEST_TABLE SET NAME = ? WHERE ID = ?";PreparedStatement pstmnt = conn.prepareStatement(DML);pstmnt.setString(1, iParam2);pstmnt.setInt(2, iParam1);int updateRowcount = pstmnt.executeUpdate();oParam [0] = updateRowcount; } // testProc()該代碼在Java類(例如JavaStoredProcs.java )中創建并進行編譯。 一個類中可以創建任意數量的過程方法。
在示例代碼中:
- 程序方法具有三個參數。 前兩個參數(iParam1和iParam2)分別為IN,第三個為OUT參數模式。 注意,OUT參數指定為數組。 每個OUT和INOUT參數都需要在過程方法中指定為數組,并且僅將數組的第一個元素用作過程參數變量(即映射)。
- 該過程使用嵌套連接。
- 拋出的任何SQL異常都可以在調用程序或過程方法中進行處理。 在這種情況下,異常將在調用代碼中處理。
2.1.2在數據庫中創建過程
該過程是使用CREATE PROCEDURE語句在數據庫中創建的。 該命令使用ij交互式運行,或者使用JDBC API的java.sql.Statement接口從Java程序運行。
命令語法和詳細信息如下:
CREATE PROCEDURE procedure-Name(ProcedureParameters)ProcedureElementsprocedure-Name :是存儲在數據庫中的過程名稱; 如果未指定,則在默認架構中創建。
ProcedureParameters :指定參數模式(IN,INOUT或OUT),可選名稱和數據類型。 數據類型是數據庫數據類型。 Java DB在過程中不支持長列類型(例如Long Varchar,BLOB等)。 參數是可選的。
ProcedureElements:此元素必須包含以下三個元素,并且可以具有其他可選元素。
- 語言JAVA。 這是唯一的值。
- 參數樣式JAVA。 這是唯一的值。
- 外部名稱。 這指定了執行過程時要調用的Java方法,并采用ClassName.methodName Optional, procedure elements形式, ClassName.methodName Optional, procedure elements :
- 動態結果集整數
- 確定性
- 外部安全
- 修改SQL數據(默認值),包含SQL,讀取SQL數據,不使用SQL(無數據庫相關代碼的過程)
2.1.2.1使用ij交互式地在數據庫中創建過程
ij是Java DB附帶的命令行工具。 ij是一個JDBC工具,用于在Java DB數據庫上運行交互式查詢。
ij> CONNECT 'jdbc:derby:testDB'; ij> CREATE PROCEDURE PROC_NAME(IN id1 INTEGER, IN name2 VARCHAR(50), OUT count3 INTEGER) LANGUAGE JAVA EXTERNAL NAME 'JavaStoredProcs.testProc' PARAMETER STYLE JAVA;在示例中,過程PROC_NAME在testDB數據庫中創建。 先前創建的Java方法 ( 2.1.1創建Java方法 )被指定為EXTERNAL NAME。
要列出數據庫中的過程,請使用命令SHOW PROCEDURES。
2.2.2更改或刪除過程
要更改過程,請從數據庫中刪除該過程,然后再次創建。
使用ij刪除過程的示例:
ij> DROP PROCEDURE procedureName;2.2使用(調用)
使用SQL CALL命令以交互方式運行過程,或者使用JDBC API從客戶端程序以交互方式運行過程。
CALL SQL命令僅支持IN參數。 JDBC API的CallableStatement接口用于調用帶有IN,INOUT或OUT參數的過程。
2.2.1 CALL SQL語句
CALL語句用于調用過程。 這不會返回值。 使用CALL調用時,僅支持帶有IN參數的過程。
以下示例顯示了從ij運行的CALL命令,以調用過程MyProc. MyProc MyProc. MyProc是數據庫中使用CREATE PROCEDURE定義的過程的名稱。
ij> CALL MyProc();2.2.2從Java程序調用過程
此示例代碼調用了先前創建的過程(PROC_NAME)(2.1創建)。
該代碼使用JDBC API的CallableStatement接口(有關更多詳細信息,請參見2.2.3關于CallableStatement的說明 )。 在此示例方法的末尾,將設置過程的輸入參數,并輸出out參數值。 請注意,此Java類與創建過程的類不同。
private static void runStoredProc(Connection conn)throws SQLException {int iParam1 = 1;String iParam2 = "updated name data";String proc = "{call PROC_NAME(?, ?, ?)}";CallableStatement cs = conn.prepareCall(proc);cs.setInt(1, iParam1);cs.setString(2, iParam2);cs.registerOutParameter(3, java.sql.Types.INTEGER);cs.executeUpdate();String oParam = cs.getInt(3);System.out.println("Updated row count from the proc: " + oParam); } // runStoredProc()2.2.3關于CallableStatement的說明
Java JDBC API的CallableStatement接口擴展了PreparedStatement并在java.sql包中定義。 這用于執行SQL存儲過程。
該API提供了一種存儲過程SQL轉義語法,該語法允許所有RDBMS以標準方式調用過程。 語法的一種形式包含結果參數,另一種形式不包含結果參數。 如果使用,則結果參數必須注冊為OUT參數。 其他參數(arg1,arg2,…)可用于輸入,輸出或兩者都使用。
以下是語法(分別具有返回值和不具有返回值):
{? = call <procedure-name> [(arg1, arg2, ...)]} {call <procedure-name> [(arg1, arg2, ...)]}使用從PreparedStatement繼承的setter方法設置IN參數值。 在使用registerOutParameter()執行存儲過程之前,必須先注冊所有OUT參數的類型。 它們的值在執行后通過getXxx(int parameterIndex / StringparameterName)方法(getBoolean(),getArray()等)檢索。
參數模式
參數屬性IN(默認),OUT和INOUT是參數模式。
調用存儲過程
String procName = "{call STORED_PRODURE_NAME(}"; CallableStatement cs = conn.prepareCall(procName); ResultSet rs = cs.executeQuery();要調用存儲過程,請使用execute(),executeQuery()或executeUpdate()方法,具體取決于過程返回的ResultSet對象數。 如果不確定該過程返回多少ResultSet對象,請使用execute()方法。
cs = conn.prepareCall("{call INCR_PRICE(?, ?)}"); cs.setString(1, itemNameArg); // (1) cs.setFloat(2, newPriceArg); // (2a) cs.registerOutParameter(2, Types.NUMERIC); // (2b) cs.execute(); float newPrice = cs.getFloat(2); // (2c)第一參數1是IN參數。
第二個參數具有參數模式INOUT。 IN值是通過調用setter方法2a指定的,并使用registerOutParameter()方法2b注冊OUT類型的。 通過吸氣劑方法2c檢索輸出值。
3個例子
有兩個示例:第一個顯示創建和使用非嵌套類型過程的代碼,第二個是Java DB預定義過程的示例用法。
3.1使用非嵌套連接
在此示例中,Java過程訪問的數據庫和連接與調用程序中使用的數據庫和連接不同。 該過程返回OUT整數參數值。
- 創建并編譯過程代碼。 public static void testProc4(int [] retval)throws SQLException {String connectionURL = "jdbc:derby:testDB2";Connection conn = DriverManager.getConnection(connectionURL);Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM ID_TABLE");int nextid = 0;while(rs.next()) {nextid = rs.getInt("ID");}retval[0] = nextid;conn.close(); // alternative: shutdown the database. } // testProc4()
- 在數據庫中創建過程。 CREATE PROCEDURE PROC_NAME_4(OUT paramname INTEGER)LANGUAGE JAVAEXTERNAL NAME 'JavaStoredProcs.testProc4'PARAMETER STYLE JAVAREADS SQL DATA;
過程元素READS SQL DATA指定SQL in過程方法只能使用SELECT語句。
- 調用客戶端程序中的過程。 private static void runStoredProc4(Connection conn)throws SQLException {String proc = "{call PROC_NAME_4(?)}";CallableStatement cs = conn.prepareCall(proc);cs.registerOutParameter(1, java.sql.Types.INTEGER);cs.execute();int oParamData = cs.getInt(1); // proc output value } // runStoredProc4()
3.2 Java DB內置系統過程
SYSCS_UTIL.SYSCS_BACKUP_DATABASE是預定義的且特定于Java DB的系統過程。 這會將數據庫備份到指定目錄。 語法為SYSCS_BACKUP_DATABASE(IN backupDirPath VARCHAR)。 該過程不返回值。
以下示例SQL命令調用該過程:
CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE('c:/backupdir');注意:在http://www.javaquizplayer.com/blogposts/blogpost4.html上,標題為“ 備份Java DB數據庫 ”的博客文章中提供了詳細的Java代碼示例。
4筆記
4.1與客戶端代碼相比,過程的某些優勢
- 該例程允許將代碼一次存儲在數據庫服務器上,并且可以從多個應用程序進行訪問。 而且,與SQL相比,代碼可能很復雜。
- 該代碼在服務器上執行,因此減少了客戶端-服務器應用程序中的網絡流量。 這樣可以提高應用程序的性能。
4.2其他RDBMS
Oracle的10g和HyperSQL數據庫(HSQLDB)是其他一些支持Java存儲過程的數據庫。
5參考
- Apache Derby>文檔(10.8手冊)
- Java SE 7 API> java.sql程序包
翻譯自: https://www.javacodegeeks.com/2013/09/java-stored-procedures-in-java-db.html
總結
以上是生活随笔為你收集整理的Java DB中的Java存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝国寿超月宝什么时候到期?
- 下一篇: Java 8的新增功能(第I部分-Jav