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

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

在討論JDBC Statement教程文章時分别,我們已經(jīng)學(xué)習(xí)了如何在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;


SQL

注意:上面的存儲過程是為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 ;


SQL

存在三種類型的參數(shù):INOUTINOUT忌愚。 PreparedStatement對象只使用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 {
   . . .
}


Java

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ù)類型挺据。

當(dāng)調(diào)用存儲過程后,可以使用適當(dāng)?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();
}


Java

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

JDBC SQL轉(zhuǎn)義語法

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

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

{keyword 'parameters'}

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

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

它們用于幫助確定日期隐绵,時間和時間戳文字。沒有哪兩個DBMS表示時間和日期的方式相同拙毫。 該轉(zhuǎn)義語法告訴驅(qū)動程序以目標(biāo)數(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);


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關(guān)鍵字

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

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


Java

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

fn 關(guān)鍵字

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

{fn length('Hello World')}


Java

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

call 關(guān)鍵字

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

{call my_procedure(?)};


Java

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

{? = call my_procedure(?)};


Java

oj關(guān)鍵字

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

{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);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末规求,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卵惦,更是在濱河造成了極大的恐慌阻肿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沮尿,死亡現(xiàn)場離奇詭異丛塌,居然都是意外死亡,警方通過查閱死者的電腦和手機畜疾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門赴邻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人庸疾,你說我怎么就攤上這事乍楚。” “怎么了届慈?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵徒溪,是天一觀的道長。 經(jīng)常有香客問我金顿,道長臊泌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任揍拆,我火速辦了婚禮渠概,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己播揪,他們只是感情好贮喧,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猪狈,像睡著了一般箱沦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雇庙,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天谓形,我揣著相機與錄音,去河邊找鬼疆前。 笑死寒跳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竹椒。 我是一名探鬼主播童太,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碾牌!你這毒婦竟也來了康愤?” 一聲冷哼從身側(cè)響起儡循,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舶吗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后择膝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體誓琼,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年肴捉,在試婚紗的時候發(fā)現(xiàn)自己被綠了腹侣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钮呀。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡藻三,死狀恐怖卢厂,靈堂內(nèi)的尸體忽然破棺而出鸵膏,到底是詐尸還是另有隱情久妆,我是刑警寧澤呜叫,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布苍日,位于F島的核電站府喳,受9級特大地震影響脖卖,放射性物質(zhì)發(fā)生泄漏乒省。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一畦木、第九天 我趴在偏房一處隱蔽的房頂上張望袖扛。 院中可真熱鬧,春花似錦十籍、人聲如沸蛆封。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惨篱。三九已至垒迂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妒蛇,已是汗流浹背机断。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绣夺,地道東北人吏奸。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像陶耍,于是被迫代替她去往敵國和親奋蔚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容