《mysql JDBC 調(diào)用存儲(chǔ)過程》要點(diǎn):
本文介紹了mysql JDBC 調(diào)用存儲(chǔ)過程,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
與oracle不同,mysql不支持匿名塊,如果需要寫過程語句,則必需定義存儲(chǔ)過程.如果你會(huì)oracle的存儲(chǔ)過程,那么mysql的存儲(chǔ)過程也很簡單了.
一.創(chuàng)建存儲(chǔ)過程
create procedure sp_name()
begin
.........
end
二.調(diào)用存儲(chǔ)過程
1.基本語法:call sp_name()
注意:存儲(chǔ)過程名稱后面必需加括號(hào),哪怕該存儲(chǔ)過程沒有參數(shù)傳遞
三.刪除存儲(chǔ)過程
1.基本語法:
drop procedure sp_name//
2.注意事項(xiàng)
(1)不能在一個(gè)存儲(chǔ)過程中刪除另一個(gè)存儲(chǔ)過程,只能調(diào)用另一個(gè)存儲(chǔ)過程
四.其他常用命令
1.show procedure status
顯示數(shù)據(jù)庫中所有存儲(chǔ)的存儲(chǔ)過程基本信息,包含所屬數(shù)據(jù)庫,存儲(chǔ)過程名稱,創(chuàng)建時(shí)間等
2.show create procedure sp_name
顯示某一個(gè)MySQL存儲(chǔ)過程的詳細(xì)信息
下面來幾個(gè)實(shí)例吧:
CREATE DATABASE `test`;
USE `test`;
CREATE TABLE `fruit` (
`id` char(36) NOTNULL COMMENT '標(biāo)識(shí)',
`name` varchar(12) NOTNULL COMMENT '名稱',
`price` decimal(8,2) NOTNULL COMMENT '單價(jià)',
`address` varchar(300) DEFAULTNULL COMMENT '產(chǎn)地',
PRIMARYKEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='水果表';
insertinto `fruit`(`id`,`name`,`price`,`address`)
values
('27640c30-8df5-4cf2-916e-c28e0b2b1b52','山竹','24.45','馬來西亞'),
('46ac8392-9922-4593-89a3-517a9e516733','菠蘿','19.41','巴西'),
('63061a9f-3a0e-4140-98e0-8b1e13e4eab3','哈密瓜','17.77','中國'),
('7ef0c286-b8b1-4e1e-9a8a-36bce703cf18','鱷梨','30.80','墨西哥'),
('a1cf5251-9311-4c7f-be10-3532d8c16291','樹莓','117.50','瑞士'),
('c397aed0-a39a-49c5-91ee-7fc0579ddb20','蓮霧','77.33','印度尼西亞'),
('e8068fa1-a8e7-4025-89e2-36c1d5d23c74','榴蓮','16.50','泰國');
創(chuàng)建存儲(chǔ)過程:
1 沒有任何輸入和輸出參數(shù)的存儲(chǔ)過程
DELIMITER $$ //這里可能有些看不懂,沒關(guān)系,文章最后附錄有詳細(xì)說明.
CREATE PROCEDURE noParam()
BEGIN
SELECT AVG(price) AS priceAvg FROM fruit;
END$$
DELIMITER ;
JDBC代碼:
/**
* 沒有任何輸入和輸出參數(shù)的存儲(chǔ)過程
*
* @author GaoHuanjie
*/
publicclass NoParam {
publicstaticvoid main(String args[]) throws SQLException {
Connection connection = LinkDB.getMySqlConnection();
String proStr = "{call noParam}";
CallableStatement callableStatement = connection.prepareCall(proStr);
callableStatement.execute();
ResultSet resultSet = callableStatement.getResultSet();
while (resultSet.next()) {
System.out.println("產(chǎn)品的平均價(jià)格是:" + resultSet.getDouble("priceAvg") + "元");
}
LinkDB.close(connection, callableStatement, resultSet);
}
}
2、只有兩個(gè)輸入?yún)?shù)的存儲(chǔ)過程
DELIMITER $$
CREATE PROCEDURE inTwoParam(IN fruitName VARCHAR(12),IN fruitPrice DECIMAL(9,2))
BEGIN
//注意:CONCAT('%',fruitName,'%')不能為'%'+fruitName+'%'
SELECT * FROM fruit WHERE NAME LIKE CONCAT('%',fruitName,'%') AND price < fruitPrice;
END$$
DELIMITER ;
/**
* 只有兩個(gè)輸入?yún)?shù)的存儲(chǔ)過程
*
* @author GaoHuanjie
*/
publicclass InTwoParam {
publicstaticvoid main(String args[]) throws SQLException {
Connection connection = LinkDB.getMySqlConnection();
String procStr = "{call inTwoParam(?,?)}";
CallableStatement callableStatement = connection.prepareCall(procStr);
callableStatement.setString(1, "蓮");
callableStatement.setDouble(2, 88.88);//對(duì)DECIMAL類型的屬性設(shè)值要使用setDouble辦法.
callableStatement.execute();
ResultSet resultSet = callableStatement.getResultSet();
System.out.println("名稱包括‘蓮’字且價(jià)格小于88.88元的水果有:");
while (resultSet.next()) {
System.err.println("名稱:" + resultSet.getString("name") +"、價(jià)格:" + resultSet.getDouble("price") + "元"+"、產(chǎn)地:" + resultSet.getString("address"));
}
LinkDB.close(connection, callableStatement, resultSet);
}
}
3、只有兩個(gè)輸出參數(shù)的存儲(chǔ)過程
DELIMITER $$
CREATE PROCEDURE outTwoParam(OUT fruitName VARCHAR(12),OUT fruitPrice DECIMAL(5,3) )
BEGIN
SELECT name INTO fruitName FROM fruit WHERE name='蓮霧';
SELECT price INTO fruitPrice FROM fruit WHERE NAME='蓮霧';
END $$
DELIMITER ;
注意:上面兩條查詢語句不能合成一個(gè)SQL語句——SELECT NAME INTO fruitName, price INTO fruitPrice FROM fruit WHERE NAME='蓮霧';
/**
* 只有兩個(gè)輸出參數(shù)的存儲(chǔ)過程
*
* @author GaoHuanjie
*/
publicclass OutTwoParam {
publicstaticvoid main(String args[]) throws SQLException {
Connection connection = LinkDB.getMySqlConnection();
String proStr = "{call outTwoParam(?,?)}";
CallableStatement callableStatement = connection.prepareCall(proStr);
callableStatement.registerOutParameter(1, Types.VARCHAR);
callableStatement.registerOutParameter(2, Types.DECIMAL);
callableStatement.execute();
String fruitName = callableStatement.getString(1);
double fruitPrice = callableStatement.getDouble(2);// 獲取DECIMAL類型的屬性要使用getDouble辦法.
System.out.println("水果名稱:" + fruitName +"、水果價(jià)格:" + fruitPrice + "元");
LinkDB.close(connection, callableStatement, null);
}
}
4、含有一個(gè)輸入?yún)?shù)和一個(gè)輸出參數(shù)的存儲(chǔ)過程
DELIMITER $$
CREATE PROCEDURE inOneParamAndOutOneParam(IN fruitName VARCHAR(12),OUT fruitPrice DECIMAL(7,3))
BEGIN
SELECT price FROM fruit WHERE NAME=fruitName INTO fruitPrice;
END $$
DELIMITER ;
/**
* 含有一個(gè)輸入?yún)?shù)和一個(gè)輸出參數(shù)的存儲(chǔ)過程
*
* @author GaoHuanjie
*/
publicclass InOneParamAndOutOneParam {
publicstaticvoid main(String args[]) throws SQLException {
Connection connection=LinkDB.getMySqlConnection();
CallableStatement callableStatement=null;
String procStr="{call inOneParamAndOutOneParam(?,?)}";
callableStatement=connection.prepareCall(procStr);
String fruitName = "蓮霧";
callableStatement.setString(1, fruitName);
callableStatement.registerOutParameter(2, Types.DECIMAL);
callableStatement.execute();
double fruitPrice=callableStatement.getDouble(2);//獲取DECIMAL類型的屬性要使用getDouble辦法.
System.out.println(fruitName+"的價(jià)格為:"+fruitPrice+"元");
LinkDB.close(connection, callableStatement, null);
}
}
5、輸入?yún)?shù)即輸出參數(shù)的存儲(chǔ)過程
DELIMITER $$
CREATE PROCEDURE inOneParamISOutOneParam(INOUT fruitName VARCHAR(12))
BEGIN
SELECT NAME INTO fruitName FROM fruit WHERE NAME LIKE CONCAT('%', fruitName, '%') LIMIT 0,1;
END $$
DELIMITER ;
或
DELIMITER $$
CREATE PROCEDURE inOneParamISOutOneParam(INOUT fruitName VARCHAR(12))
BEGIN
SELECT NAME FROM fruit WHERE NAME LIKE CONCAT('%', fruitName, '%') LIMIT 0,1 INTO fruitName;
END $$
DELIMITER ;
-- 注意上面查詢語句不能這樣寫:
-- SELECT NAME FROM fruit WHERE NAME LIKE CONCAT('%', fruitName, '%') INTO fruitName LIMIT 0,1;
-- 注意:對(duì)比3、4和5Java文件內(nèi)創(chuàng)建存儲(chǔ)過程腳本中“INTO”關(guān)鍵字的位置你必定深有收獲
/**
* 輸入?yún)?shù)即輸出參數(shù)的存儲(chǔ)過程
*
* @author GaoHuanjie
*/
publicclass InOneParamISOutOneParam {
publicstaticvoid main(String args[]) throws SQLException {
Connection con = LinkDB.getMySqlConnection();
CallableStatement callableStatement = null;
String procStr = "{call inOneParamISOutOneParam(?)}";
callableStatement = con.prepareCall(procStr);
callableStatement.setString(1, "蓮");
callableStatement.registerOutParameter(1, Types.VARCHAR);
callableStatement.execute();
String fruitName = callableStatement.getString(1);
System.out.println("表中水果名稱含有‘蓮’字的一中水果的名稱是:" + fruitName);
LinkDB.close(con, callableStatement, null);
}
}
以上代碼展示了mysql存儲(chǔ)過程以及在jdbc中調(diào)用的過程.
如果必要在mysql中調(diào)用
/*定義delimiter為 // */
delimiter //
CREATE procedure sp_add3(a int, b int,out c int)
begin
set c=a+ b;
end//
在mysql中調(diào)用存儲(chǔ)過程
/* 改回默認(rèn)值 ; */
delimiter ;
//
call sp_add3(1,2,@c);
select@c;
附錄:
MySql中 delimiter 詳解
其實(shí)就是告訴MySQL解釋器,該段命令是否已經(jīng)結(jié)束了,mysql是否可以執(zhí)行了.默認(rèn)情況下,delimiter是分號(hào);.在命令行客戶端中,如果有一行命令以分號(hào)結(jié)束,那么回車后,mysql將會(huì)執(zhí)行該命令.
如輸入下面的語句
mysql> select * from test_table;
然后回車,那么MySQL將立即執(zhí)行該語句.
但有時(shí)候,不希望MySQL這么做.在為可能輸入較多的語句,且語句中包括有分號(hào).
如試圖在命令行客戶端中輸入如下語句
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql> RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql> RETURN '';
mysql> ELSEIF N<15 THEN
mysql> RETURN LEFT(S, N);
mysql> ELSE
mysql> IF CHAR_LENGTH(S) <=N THEN
mysql> RETURN S;
mysql> ELSE
mysql> RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql> END IF;
mysql> END IF;
mysql> END;
默認(rèn)情況下,不可能比及用戶把這些語句全部輸入完之后,再執(zhí)行整段語句.
因?yàn)閙ysql一遇到分號(hào),它就要自動(dòng)執(zhí)行.
即,在語句RETURN '';時(shí),mysql解釋器就要執(zhí)行了.
這種情況下,就必要事先把delimiter換成其它符號(hào),如//或$$.
《mysql JDBC 調(diào)用存儲(chǔ)過程》是否對(duì)您有啟發(fā),歡迎查看更多與《mysql JDBC 調(diào)用存儲(chǔ)過程》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/7870.html