《mysql JDBC 調用存儲過程》要點:
本文介紹了mysql JDBC 調用存儲過程,希望對您有用。如果有疑問,可以聯系我們。
與oracle不同,mysql不支持匿名塊,如果需要寫過程語句,則必需定義存儲過程.如果你會oracle的存儲過程,那么mysql的存儲過程也很簡單了.
一.創建存儲過程
create procedure sp_name()
begin
.........
end
二.調用存儲過程
1.基本語法:call sp_name()
注意:存儲過程名稱后面必需加括號,哪怕該存儲過程沒有參數傳遞
三.刪除存儲過程
1.基本語法:
drop procedure sp_name//
2.注意事項
(1)不能在一個存儲過程中刪除另一個存儲過程,只能調用另一個存儲過程
四.其他常用命令
1.show procedure status
顯示數據庫中所有存儲的存儲過程基本信息,包含所屬數據庫,存儲過程名稱,創建時間等
2.show create procedure sp_name
顯示某一個MySQL存儲過程的詳細信息
下面來幾個實例吧:
CREATE DATABASE `test`;
USE `test`;
CREATE TABLE `fruit` (
`id` char(36) NOTNULL COMMENT '標識',
`name` varchar(12) NOTNULL COMMENT '名稱',
`price` decimal(8,2) NOTNULL COMMENT '單價',
`address` varchar(300) DEFAULTNULL COMMENT '產地',
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','泰國');
創建存儲過程:
1 沒有任何輸入和輸出參數的存儲過程
DELIMITER $$ //這里可能有些看不懂,沒關系,文章最后附錄有詳細說明.
CREATE PROCEDURE noParam()
BEGIN
SELECT AVG(price) AS priceAvg FROM fruit;
END$$
DELIMITER ;
JDBC代碼:
/**
* 沒有任何輸入和輸出參數的存儲過程
*
* @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("產品的平均價格是:" + resultSet.getDouble("priceAvg") + "元");
}
LinkDB.close(connection, callableStatement, resultSet);
}
}
2、只有兩個輸入參數的存儲過程
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 ;
/**
* 只有兩個輸入參數的存儲過程
*
* @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);//對DECIMAL類型的屬性設值要使用setDouble辦法.
callableStatement.execute();
ResultSet resultSet = callableStatement.getResultSet();
System.out.println("名稱包括‘蓮’字且價格小于88.88元的水果有:");
while (resultSet.next()) {
System.err.println("名稱:" + resultSet.getString("name") +"、價格:" + resultSet.getDouble("price") + "元"+"、產地:" + resultSet.getString("address"));
}
LinkDB.close(connection, callableStatement, resultSet);
}
}
3、只有兩個輸出參數的存儲過程
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 ;
注意:上面兩條查詢語句不能合成一個SQL語句——SELECT NAME INTO fruitName, price INTO fruitPrice FROM fruit WHERE NAME='蓮霧';
/**
* 只有兩個輸出參數的存儲過程
*
* @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 +"、水果價格:" + fruitPrice + "元");
LinkDB.close(connection, callableStatement, null);
}
}
4、含有一個輸入參數和一個輸出參數的存儲過程
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 ;
/**
* 含有一個輸入參數和一個輸出參數的存儲過程
*
* @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+"的價格為:"+fruitPrice+"元");
LinkDB.close(connection, callableStatement, null);
}
}
5、輸入參數即輸出參數的存儲過程
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;
-- 注意:對比3、4和5Java文件內創建存儲過程腳本中“INTO”關鍵字的位置你必定深有收獲
/**
* 輸入參數即輸出參數的存儲過程
*
* @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存儲過程以及在jdbc中調用的過程.
如果必要在mysql中調用
/*定義delimiter為 // */
delimiter //
CREATE procedure sp_add3(a int, b int,out c int)
begin
set c=a+ b;
end//
在mysql中調用存儲過程
/* 改回默認值 ; */
delimiter ;
//
call sp_add3(1,2,@c);
select@c;
附錄:
MySql中 delimiter 詳解
其實就是告訴MySQL解釋器,該段命令是否已經結束了,mysql是否可以執行了.默認情況下,delimiter是分號;.在命令行客戶端中,如果有一行命令以分號結束,那么回車后,mysql將會執行該命令.
如輸入下面的語句
mysql> select * from test_table;
然后回車,那么MySQL將立即執行該語句.
但有時候,不希望MySQL這么做.在為可能輸入較多的語句,且語句中包括有分號.
如試圖在命令行客戶端中輸入如下語句
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;
默認情況下,不可能比及用戶把這些語句全部輸入完之后,再執行整段語句.
因為mysql一遇到分號,它就要自動執行.
即,在語句RETURN '';時,mysql解釋器就要執行了.
這種情況下,就必要事先把delimiter換成其它符號,如//或$$.
《mysql JDBC 調用存儲過程》是否對您有啟發,歡迎查看更多與《mysql JDBC 調用存儲過程》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7870.html