1. 程式人生 > >JDBC存儲過程調用

JDBC存儲過程調用

對象方法 需要 rst mat limit ava getx t對象 描述

在討論JDBC Statement教程文章時,我們已經學習了如何在JDBC中使用存儲過程。 本教程文章與該部分類似,但它將講解演示有關JDBC SQL轉義語法的其他信息。

就像Connection對象創建StatementPreparedStatement對象一樣,它可使用同樣的方式創建CallableStatement對象,該對象將用於執行對數據庫存儲過程的調用。

創建CallableStatement對象

假設需要執行以下Oracle存儲過程 -

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;
SQL

註意:上面的存儲過程是為Oracle編寫的,但是如果使用MySQL數據庫,參考以下代碼為MySQL編寫相同的存儲過程,如下在EMP數據庫中創建它 -

DELIMITER $$

DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` 
   (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END $$

DELIMITER ;
SQL

存在三種類型的參數:INOUTINOUTPreparedStatement對象只使用IN參數。 CallableStatement對象可以使用上面三種類型參數。

以下是上面三種類型參數的定義 -

參數描述
IN 創建SQL語句時其參數值是未知的。 使用setXXX()方法將值綁定到IN參數。
OUT 由SQL語句返回的參數值。可以使用getXXX()方法從OUT參數中檢索值。
INOUT 提供輸入和輸出值的參數。使用setXXX()方法綁定變量並使用getXXX()方法檢索值。

以下代碼片段顯示了如何使用Connection.prepareCall()

方法根據上述存儲過程來實例化一個CallableStatement對象 -

CallableStatement cstmt = null;
try {
   String str = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}
Java

String變量str表示存儲過程,帶有參數占位符。

使用CallableStatement對象與使用PreparedStatement對象很像。 在執行語句之前,必須將值綁定到所有參數,否則將收到一個SQLException異常。

如果有IN參數,只需遵循適用於PreparedStatement對象的相同規則和技術; 使用與綁定的Java數據類型相對應的setXXX()方法。

使用OUTINOUT參數時,必須使用一個額外的CallableStatement對象方法registerOutParameter()registerOutParameter()方法將JDBC數據類型綁定到存儲過程預期返回的數據類型。

當調用存儲過程後,可以使用適當的getXXX()方法從OUT參數中檢索該值。 此方法將檢索到的SQL類型的值轉換為Java數據類型。

關閉CallableStatement對象

就像關閉其他Statement對象一樣,由於同樣的原因(節省資源),還應該關閉CallableStatement對象。

簡單的調用close()方法將執行關閉工作。 如果先關閉Connection對象,它也會關閉CallableStatement對象。 但是,應該始終顯式關閉CallableStatement對象,以確保正確的順序清理。

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}
Java

有關更多的細節,建議學習研究“Callable實例代碼”

JDBC SQL轉義語法

通過使用標準JDBC方法和屬性,轉義語法使您能夠靈活地使用不可用的數據庫特定功能。

一般SQL轉義語法格式如下 -

{keyword ‘parameters‘}

以下是以下轉義序列,在執行JDBC編程時非常有用 -

d, t, ts關鍵字

它們用於幫助確定日期,時間和時間戳文字。沒有哪兩個DBMS表示時間和日期的方式相同。 該轉義語法告訴驅動程序以目標數據庫的格式呈現日期或時間。 例如 -

{d ‘yyyy-mm-dd‘}

yyyy=年份,mm=月份; dd=日期。 使用這種語法{d‘2019-09-03‘}表示的是2019年3月9日。

這是一個簡單的示例,顯示如何將日期插入表中 -

//Create a Statement object
stmt = conn.createStatement();
//Insert data ==> ID, First Name, Last Name, DOB
String sql="INSERT INTO STUDENTS VALUES" +
             "(100,‘Kobe‘,‘Bryant‘, {d ‘2002-12-16‘})";

stmt.executeUpdate(sql);
Java

同樣,還可以使用以下兩種語法:tts -

{t ‘hh:mm:ss‘}

這裏,hh=小時,mm =分鐘, ss =秒。 使用這種語法{t ‘13:30:29‘}1:30:29 PM

{ts ‘yyyy-mm-dd hh:mm:ss‘}

這裏“d”和“t”是上述兩種語法的組合語法來表示時間戳。

escape關鍵字

escape關鍵字標識LIKE子句中使用轉義字符。 使用SQL通配符%(與0個或多個字符匹配)時很有用。 例如 -

String sql = "SELECT symbol FROM MathSymbols
              WHERE symbol LIKE ‘\%‘ {escape ‘\‘}";
stmt.execute(sql);
Java

如果使用反斜杠字符(\)作為轉義字符,則還必須在Java字符串文字中使用兩個反斜杠字符,因為反斜杠也是Java轉義字符。

fn 關鍵字

這個關鍵字表示DBMS中使用的標量函數。 例如,可以使用SQL函數長度來獲取字符串的長度 -

{fn length(‘Hello World‘)}
Java

上面語句返回結果值為:11,也就是字符串’Hello World‘的長度。

call 關鍵字

此關鍵字用於調用存儲過程。 例如,對於需要IN參數的存儲過程,請使用以下語法 -

{call my_procedure(?)};
Java

對於需要IN參數並返回OUT參數的存儲過程,請使用以下語法 -

{? = call my_procedure(?)};
Java

oj關鍵字

此關鍵字用於表示外部連接。 語法如下 -

{oj outer-join}
Java

這裏,outer-join = table {LEFT|RIGHT|FULL} OUTERJOIN {table | outer-join} 搜索條件。 例如 -

String sql = "SELECT Employees 
              FROM {oj ThisTable RIGHT
              OUTER JOIN ThatTable on id = ‘100‘}";
stmt.execute(sql);

JDBC存儲過程調用