日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java DB中的Java存储过程

發布時間:2023/12/3 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)ProcedureElements

procedure-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存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。