与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 调用存储过程相关推荐

  1. mysql用函数调用存储过程_mysql 函数 调用 存储过程

    Mysql高级之存储过程 原文: Mysql高级之存储过程 概念类似于函数,就是把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现.在封装的语句体里面,可以用if/else,  ...

  2. 如何调用mysql的存储过程_mysql如何调用存储过程

    mysql调用存储过程的方法:可以利用CALL语句来调用存储过程,语法为[CALL sp_name([parameter])].调用存储过程可以使程序执行效率更高,增强程序的可重用性和维护性. MyS ...

  3. mysql 视图调用存储过程_MySQL视图、存储过程

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 什么是视图(视图) 虚拟表 内容类似于真实表,有字段和记录 该视图不以数据库中存储的数据的形式存在 行和列的数据来自 ...

  4. PL/Sql 中创建、调试、调用存储过程

    存储过程  所用函数说明  功能:求和与差  原形:GetSumAndSub(p1 in number , p2 in number ,m out number , b out number)   参 ...

  5. Oracle 存储过程,Hibernate 调用存储过程,JDBC调用存储过程,Oracle 动态SQL

    Oracle 存储过程学习 目录 Oracle 存储过程........................................................................ ...

  6. mysql存储过程遍历新增_MySQL存储过程:内部调用存储过程、存储过程实现遍历数据库建表以及修改字段...

    转载: https://blog.csdn.net/weixin_42159024/article/details/81488788 实现功能: 升级数据库.通过遍历所有数据库,对每个数据库进行升级, ...

  7. thinkphp调用mysql存储过程_ThinkPHP执行调用存储过程怎么添加日志

    ThinkPHP执行调用存储过程怎么添加日志//PHP代码部分/** * [LogAdd 操作日志] * @param [string] $userid [用户的ID] * @param [strin ...

  8. mysql与oracle存储过程_mysql与oracle存储过程对比

    一.创建存储过程语句不同 mysql DROP PROCEDURE IF EXISTS `SD_USER_P_ADD_USR`; create procedure P_ADD_FAC(id_fac_c ...

  9. jfinal mysql存储过程_jfinal如何调用存储过程?

    存储过程用一下 Db.execute(ICallback) 这个方法,在其中用一下: connection.prepareCall(sql).execute(); 就可以调用存储过程了,并且还可以自由 ...

最新文章

  1. PHP 7.3声称速度比PHP 5快3倍还多,值得更新了!
  2. 计算机房电磁辐射防护,计算机房电磁屏蔽
  3. do while循环语句_流程控制之循环语句【while循环语句】
  4. 2、SpringBoot整合JDBC
  5. Centos开机自己主动挂载windows中的ntfs磁盘
  6. 动画:什么是散列表?
  7. JavaScript之继承和prototype
  8. 加壳后软件报毒解决办法
  9. UG不用计算机名,win10系统安装UG软件后打开提示计算机名不对的解决步骤
  10. 在深圳,考PMP需要花费多少钱?
  11. 加密狗工作原理和破解方法简介
  12. linux运行mentohust,Linux中用mentohust设置联网环境
  13. 解决谷歌浏览器Chrome不能播放央视新闻视频的问题
  14. 菜鸟日记(yzy):opencMS系统-XML内容管理文件开发
  15. 非三星手机无法登录三星账号_如何解决所有三星手机的烦恼
  16. uni-app双排一起滑动--两行同步滑动
  17. GitHub 上受欢迎的 Android UI Library(part_one)
  18. frl啥意思_FRL是什么意思
  19. 应用程序无法正常启动0xc00007b的解决(二)
  20. VoLTE, IMS, VOIP, LTE之间的关系

热门文章

  1. Mac IntelliJ IDEA 快捷键终极大全,速度收藏!
  2. Gitlab CI 持续集成的完整实践
  3. 微服务架构如何保障双11狂欢下的99.99%高可用?
  4. post json 提示远程服务器500_解决WinServer2012R2服务器远程提示“参数错误”
  5. html代码复制到asp中不一样了_迷你代码编程在线成语词典
  6. linux下运行js挖矿,利用 JavaScript 代码挖矿
  7. Springboot集成websocket实例
  8. 基于视觉Transformer的目标检测
  9. Win 10 安装detectron2 详细手册
  10. python--numpy pad函数使用