JDBC存儲過程
在前而我們已經學習了如何使用使用JDBC存儲過程,JDBC Statements。本教學是類似,但它會將有關JDBC的SQL轉義語法的附加信息。
正如一個Connection對象創建Statement和PreparedStatement對象,它也創造了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;
注意: 上麵已經寫過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 ;
三種類型的參數有:IN,OUT和INOUT。PreparedStatement對象隻使用IN參數。 CallableStatement對象可以使用所有的三個。
這裡是每個定義:
參數 | 描述 |
---|---|
IN | 它的值是在創建SQL語句時未知的參數。將值綁定到setXXX()方法的參數。 |
OUT | 其值是由它返回的SQL語句提供的參數。你從OUT參數的getXXX()方法檢索值。 |
INOUT | 同時提供輸入和輸出值的參數。綁定setXXX()方法的變量,並與getXXX()方法檢索值。 |
下麵的代碼片段顯示了如何使用該Connection.prepareCall()方法實例化基於上述存儲過程CallableStatement對象:
CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt = conn.prepareCall (SQL); . . . } catch (SQLException e) { . . . } finally { . . . }
String變量的SQL表示存儲過程,使用參數占位符。
使用CallableStatement對象是使用PreparedStatement對象。必須將值綁定到所有的參數執行該語句之前,否則將收到一個SQLException。
如果有IN參數,隻要按照適用於PreparedStatement對象相同的規則和技巧;使用對應於要綁定Java數據類型的setXXX()方法。
當使用OUT和INOUT參數就必須采用額外CallableStatement方法的registerOutParameter()。registerOutParameter()方法JDBC數據類型綁定到數據類型的存儲過程返回。
一旦調用存儲過程,用getXXX()方法的輸出參數檢索值。這種方法投射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(); }
為了更好地理解,建議研究學習Callable實例代碼.
JDBC的SQL轉義語法:
轉義語法使能夠使用通過使用標準的JDBC方法和屬性,無法使用數據庫的某些特性的靈活性。
一般的SQL轉義語法格式如下:
{keyword 'parameters'}
這裡有以下這些,會發現非常有用的,而這樣做的JDBC編程的轉義序列:
d, t, ts 關鍵字:
他們幫助確定日期,時間和時間戳記文字。如所知,冇有兩個數據庫管理係統是基於時間和日期的方式相同。此轉義語法告訴驅動程序呈現在目標數據庫的格式,日期或時間。實現例子:
{d 'yyyy-mm-dd'}
其中yyyy=年,mm =月,DD =日。使用這種語法 {d '2009-09-03'}是2009年3月9日。
下麵是一個簡單的例子說明如何插入日期表:
//Create a Statement object stmt = conn.createStatement(); //Insert data ==> ID, First Name, Last Name, DOB String sql="INSERT INTO STUDENTS VALUES" + "(100,'Zara','Ali', {d '2001-12-16'})"; stmt.executeUpdate(sql);
同樣,可以使用以下兩種語法之一,無論是 t 或 ts:
{t 'hh:mm:ss'}
其中hh=小時,mm=分,ss=秒。使用此語法 {t '13:30:29'}是下午1點三十分29秒.
{ts 'yyyy-mm-dd hh:mm:ss'}
這是上述兩種語法 'd' 和 't' 來表示時間戳結合語法。
escape 關鍵字:
該關鍵字標識LIKE子句中使用的轉義字符。有用使用SQL通配符%,其中匹配零個或多個字符時。例如:
String sql = "SELECT symbol FROM MathSymbols WHERE symbol LIKE '\%' {escape ''}"; stmt.execute(sql);
如果使用反斜杠字符()作為轉義字符,還必須使用兩個反斜杠字符在Java字符串字麵,因為反斜杠也是一個Java轉義字符。
fn 關鍵字:
此關鍵字代表在DBMS中使用標量函數。例如,可以使用SQL length函數計算GE字符串的長度:
{fn length('Hello World')}
這將返回11,字符串 'Hello World'的長度。.
call 關鍵字:
此關鍵字是用來調用存儲過程。例如,對於一個存儲過程,需要一個IN參數,請使用以下語法:
{call my_procedure(?)};
對於一個存儲過程,需要一個IN參數並返回一個OUT參數,使用下麵的語法:
{? = call my_procedure(?)};
oj 關鍵字:
此關鍵字用來表示外部聯接。其語法如下:
{oj outer-join}
外連接表={LEFT| RIGHT| FULL}外連接{表|外連接}的搜索條件。例如:
String sql = "SELECT Employees FROM {oj ThisTable RIGHT OUTER JOIN ThatTable on id = '100'}"; stmt.execute(sql);