鍍金池/ 教程/ Java/ JDBC存儲過程調(diào)用
JDBC Like子句實例
JDBC異常
JDBC排序數(shù)據(jù)實例
JDBC事務(wù)保存點(setSavepoint, releaseSavepoint )實例
JDBC結(jié)果集
JDBC Statement對象執(zhí)行批量處理實例
JDBC事務(wù)
JDBC SQL語法
JDBC快速入門教程
JDBC創(chuàng)建數(shù)據(jù)庫實例
JDBC流ASCII和二進制數(shù)據(jù)
JDBC刪除表實例
JDBC Statements, PreparedStatement和CallableStatement語句
JDBC WHERE子句條件實例
JDBC插入數(shù)據(jù)實例
JDBC驅(qū)動程序類型
JDBC環(huán)境配置
JDBC數(shù)據(jù)庫連接
JDBC刪除數(shù)據(jù)實例
JDBC PrepareStatement對象執(zhí)行批量處理實例
JDBC刪除數(shù)據(jù)庫實例
JDBC事務(wù)提交/回滾實例
JDBC更新數(shù)據(jù)實例
JDBC存儲過程調(diào)用
JDBC教程
JDBC批量處理
JDBC創(chuàng)建表實例
JDBC數(shù)據(jù)類型
JDBC是什么?
JDBC簡單示例代碼
JDBC選擇數(shù)據(jù)庫實例
JDBC查詢數(shù)據(jù)實例

JDBC存儲過程調(diào)用

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

就像Connection對象創(chuàng)建StatementPreparedStatement對象一樣,它可使用同樣的方式創(chuàng)建CallableStatement對象,該對象將用于執(zhí)行對數(shù)據(jù)庫存儲過程的調(diào)用。

創(chuàng)建CallableStatement對象

假設(shè)需要執(zhí)行以下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;

注意:上面的存儲過程是為Oracle編寫的,但是如果使用MySQL數(shù)據(jù)庫,參考以下代碼為MySQL編寫相同的存儲過程,如下在EMP數(shù)據(jù)庫中創(chuàng)建它 -

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 ;

存在三種類型的參數(shù):IN,OUTINOUTPreparedStatement對象只使用IN參數(shù)。 CallableStatement對象可以使用上面三種類型參數(shù)。

以下是上面三種類型參數(shù)的定義 -

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

以下代碼片段顯示了如何使用Connection.prepareCall()方法根據(jù)上述存儲過程來實例化一個CallableStatement對象 -

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

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

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

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

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

當調(diào)用存儲過程后,可以使用適當?shù)?code>getXXX()方法從OUT參數(shù)中檢索該值。 此方法將檢索到的SQL類型的值轉(zhuǎn)換為Java數(shù)據(jù)類型。

關(guān)閉CallableStatement對象

就像關(guān)閉其他Statement對象一樣,由于同樣的原因(節(jié)省資源),還應(yīng)該關(guān)閉CallableStatement對象。

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

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

有關(guān)更多的細節(jié),建議學習研究“Callable實例代碼

JDBC SQL轉(zhuǎn)義語法

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

一般SQL轉(zhuǎn)義語法格式如下 -

{keyword 'parameters'}

以下是以下轉(zhuǎn)義序列,在執(zhí)行JDBC編程時非常有用 -

d, t, ts關(guān)鍵字

它們用于幫助確定日期,時間和時間戳文字。沒有哪兩個DBMS表示時間和日期的方式相同。 該轉(zhuǎn)義語法告訴驅(qū)動程序以目標數(shù)據(jù)庫的格式呈現(xiàn)日期或時間。 例如 -

{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);

同樣,還可以使用以下兩種語法: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關(guān)鍵字

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

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

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

fn 關(guān)鍵字

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

{fn length('Hello World')}

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

call 關(guān)鍵字

此關(guān)鍵字用于調(diào)用存儲過程。 例如,對于需要IN參數(shù)的存儲過程,請使用以下語法 -

{call my_procedure(?)};

對于需要IN參數(shù)并返回OUT參數(shù)的存儲過程,請使用以下語法 -

{? = call my_procedure(?)};

oj關(guān)鍵字

此關(guān)鍵字用于表示外部連接。 語法如下 -

{oj outer-join}

這里,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);