mysql数据库的存储过程不用学吗,MySql数据库之存储过程学习_MySQL

之前在工作中总是听别人提到存储过程,觉得是个很高深的东西,利用工作之余,看了下相关的知识,现将学习知识总结如下,希望可以为刚学习的人提供些许帮助。

开发环境:Navicat For Mysql。

MySQL存储过程

1.1、CREATE PROCEDURE (创建)

CREATE PROCEDURE存储过程名 (参数列表)

BEGIN

SQL语句代码块

END

注意:

由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数。要指定为其它参数,可在参数名之前使用关键词 OUT或INOUT

实例演练:

eg1,带(输出参数)返回值的存储过程:

1、建表

create table abin5(

id int,

name5 VARCHAR(39)

)

2、创建存储过程

create procedure pabin5(out n int)

BEGIN

select count(*) from abin5;

END

3、测试存储过程

call pabin5(@n)

eg2,带输入参数的存储过程:

1、建立存储过程

create procedure pabin6(in n int)

BEGIN

SELECT * FROM abin5 where id=n;

END

2、测试存储过程

SET @n=1;

CALL pabin6(@n)

或者

CALL pabin6(1)

在mysql客户端定义存储过程的时候使用delimiter命令来把语句定界符从;变为//。

当使用delimiter命令时,你应该避免使用反斜杠(‘"’)字符,因为那是MySQL的转义字符。

如:

mysql> delimiter //

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)

-> BEGIN

-> SELECT COUNT(*) INTO param1 FROM t;

-> END

-> //

Query OK, 0 rows affected (0.00 sec)

1.2 ALTER PROCEDURE (修改)

ALTER PROCEDURE 存储过程名SQL语句代码块

这个语句可以被用来改变一个存储程序的特征。

1.3 DROP PROCEDURE (删除)

DROP PROCEDURE IF EXISTS存储过程名

eg:DROP PROCEDURE IF EXISTS proc_employee (proc_employee 存储过程名)

这个语句被用来移除一个存储程序。不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

1.4 SHOW CREATE PROCEDURE(类似于SHOW CREATE TABLE,查看一个已存在的存储过程)

SHOW CREATE PROCEDURE 存储过程名

1.5 SHOW PROCEDURE STATUS (列出所有的存储过程)

SHOW PROCEDURE STATUS

1.6 CALL语句(存储过程的调用)

CALL 存储过程名(参数列表)

CALL语句调用一个先前用CREATE PROCEDURE创建的程序。

CALL语句可以用声明为OUT或的INOUT参数的参数给它的调用者传回值。

存储过程名称后面必须加括号,哪怕该存储过程没有参数传递

1.7 BEGIN ... END(复合语句)

[begin_label:]

BEGIN

[statement_list]

END

[end_label]

存储子程序可以使用BEGIN ... END复合语句来包含多个语句。

statement_list 代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。

复合语句可以被标记。除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的。

1.8 DECLARE语句(用来声明局部变量)

DECLARE语句被用来把不同项目局域到一个子程序:局部变量

DECLARE仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前。

1.9 存储程序中的变量

1.1 DECLARE局部变量

DECLARE var_name[,...] type [DEFAULT value]

这个语句被用来声明局部变量。

要给变量提供一个默认值,请包含一个DEFAULT子句。

值可以被指定为一个表达式,不需要为一个常数。

如果没有DEFAULT子句,初始值为NULL。

局部变量的作用范围在它被声明的BEGIN ... END块内。

它可以被用在嵌套的块中,除了那些用相同名字声明变量的块。

1.2 变量SET语句

SET var_name = expr [, var_name = expr]

在存储程序中的SET语句是一般SET语句的扩展版本。

被参考变量可能是子程序内声明的变量,或者是全局服务器变量。

在存储程序中的SET语句作为预先存在的SET语法的一部分来实现。这允许SET a=x, b=y, ...这样的扩展语法。

其中不同的变量类型(局域声明变量及全局和集体变量)可以被混合起来。

这也允许把局部变量和一些只对系统变量有意义的选项合并起来。

1.3 SELECT ... INTO语句

SELECT col_name[,...] INTO var_name[,...] table_expr

这个SELECT语法把选定的列直接存储到变量。

因此,只有单一的行可以被取回。

SELECT id,data INTO x,y FROM test.t1 LIMIT 1;

注意,用户变量名在MySQL 5.1中是对大小写不敏感的。

重要: SQL变量名不能和列名一样。如果SELECT ... INTO这样的SQL语句包含一个对列的参考,并包含一个与列相同名字的局部变量,MySQL当前把参考解释为一个变量的名字。

1.10 MySQL 存储过程参数类型(in、out、inout)

MySQL 存储过程参数(in)

MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible)。

MySQL 存储过程参数(out)

MySQL 存储过程 “out” 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值

MySQL 存储过程参数(inout)

MySQL 存储过程 inout 参数跟 out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout 参数传递值给存储过程。

总结

如果仅仅想把数据传给 MySQL 存储过程,那就使用“in” 类型参数;如果仅仅从 MySQL 存储过程返回值,那就使用“out” 类型参数;如果需要把数据传给 MySQL 存储过程,还要经过一些计算后再传回给我们,此时,要使用“inout” 类型参数。

1.11 例子:

1.1 创建存储过程

带(输出参数)返回值的存储过程:

--删除存储过程

DROP PROCEDURE IF EXISTS proc_employee_getCount

--创建存储过程

CREATE PROCEDURE proc_employee_getCount(out n int)

BEGIN

SELECT COUNT(*) FROM employee ;

END

--MYSQL调用存储过程

CALL proc_employee_getCount(@n);

带输入参数的存储过程:

--删除存储过程

DROP PROCEDURE IF EXISTS proc_employee_findById;

--创建存储过程

CREATE PROCEDURE proc_employee_findById(in n int)

BEGIN

SELECT * FROM employee where id=n;

END

--定义变量

SET @n=1;

--调用存储过程

CALL proc_employee_findById(@n);

操作存储过程时应注意:

1. 删除存储过程时只需要指定存储过程名即可,不带括号;

2. 创建存储过程时,不管该存储过程有无参数,都需要带括号;

3. 在使用SET定义变量时应遵循SET的语法规则;

SET @变量名=初始值;

4. 在定义存储过程参数列表时,应注意参数名与数据库中字段名区别开来,否则将出现无法预期的结果

1.12 Java代码调用存储过程(JDBC)

相关API:java.sql.CallableStatement

使用到java.sql.CallableStatement接口,该接口专门用来调用存储过程;

该对象的获得依赖于java.sql.Connection;

通过Connection实例的prepareCall()方法返回CallableStatement对象

prepareCall()内部为一固定写法{call 存储过程名(参数列表1,参数列表2)}可用?占位

eg: connection.prepareCall("{call proc_employee(?)}");

存储过程中参数处理:

输入参数:通过java.sql.CallableStatement实例的setXXX()方法赋值,用法等同于java.sql.PreparedStatement

输出参数:通过java.sql.CallableStatement实例的registerOutParameter(参数位置, 参数类型)方法赋值,其中参数类型主要使用java.sql.Types中定义的类型

Java代码调用带输入参数的存储过程 (根据输入ID查询雇员信息)

publicvoid executeProcedure()

{

try {

/**

*callableStatementjava.sql.CallableStatement

*connectionjava.sql.Connection

*jdbc调用存储过程原型

*{call存储过程名(参数列表1,参数列表2)}可用?代替

*/

callableStatement=connection.prepareCall("{call proc_employee_findById(?)}");

callableStatement.setInt(1, 1); //设置输入参数

resultSet=callableStatement.executeQuery();//执行存储过程

if(resultSet.next())

{

System.out.println(resultSet.getInt(1)+""t"+resultSet.getString(2));

}

} catch (SQLException e) {

e.printStackTrace();

}

}

Java代码调用带输出参数的存储过程 (返回数据库中的记录数)

publicvoid executeProcedure()

{

try {

/**

*callableStatementjava.sql.CallableStatement

*connectionjava.sql.Connection

*jdbc调用存储过程原型

*{call存储过程名(参数列表1,参数列表2)}可用?代替

*/

callableStatement=connection.prepareCall("{call proc_employee_getCount(?)}");

//设置输出参数

callableStatement.registerOutParameter(1, Types.INTEGER);

//执行存储过程

resultSet=callableStatement.executeQuery();

if(resultSet.next())

{

System.out.println(resultSet.getInt(1));

}

} catch (SQLException e) {

e.printStackTrace();

}

}

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

TAG标签:过程数据库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

// D:\SaveLog\_SaveLog.dpr立即备份晓亮的电脑操作记录热键(快捷键) F11由于原来的 AutoIt 杀毒软件总是误报没办法只好麻烦一点用 Delphi XE4 做了...

// D:\SaveLog\_SaveLog.dpr立即备份晓亮的电脑操作记录 热键(快捷键) F11由于原来的 AutoIt 杀毒软件总是误报没办法只好麻烦一点用 Delphi 各种版本 做了 (我主要用的版本是Delphi2007(Delphi11)) (从Delphi6到Embarcadero.Delphi.XE5.Lite) // D:\SaveLog\_SaveLog.dpr立即备…

python list sort by,python中List的sort方法指南

简单记一下python中List的sort方法(或者sorted内建函数)的用法。List的元素可以是各种东西,字符串,字典,自己定义的类等。sorted函数用法如下:sorted(data, cmpNone, keyNone, reverseFalse)其中,data是待排序数据&…

开站资源

1. 存储 七牛云存储 http://www.qiniu.com/ 2. 网站模板 https://drupal.org/ 参考:http://www.w3cplus.com转载于:https://www.cnblogs.com/javawer/p/3407065.html

sublime php运行环境,sublime php 运行环境

sublime php 运行环境sublime php 运行环境有时候需要用运行一段 PHP 代码,比如测试某个函数返回值等等,如果启动Http Server,再打开浏览器,那黄花菜都凉了。我们可以在 Sublime Text 3 中创建 php 的 build system,这…

由硬盘供电不稳、数据线品质差造成的蓝屏

开机正常,一但运行高IOPS的软件,就会蓝屏。 换电源或换数据线。或减短线路长度。 常见:0x0000007a rdyboost.sys ntkrnlpa.exe、0x000000f4 ntkrnlpa.exe Hookport.sys、0x1000008e ntkrnlpa.exe kisknl.sys。转载于:https://www.cnblogs.com…

用Java写有关早上的语录,实用的适合早上发的早安问候语语录汇编39句

实用的适合早上发的早安问候语语录汇编39句不管梦想是什么,只有带着淡然的态度,做好当前的事情。早安!下面是小编精心准备的适合早上发的早安问候语39句,欢迎大家前来欣赏。1、世上除了生死,其它都是小事。不管遇到了什么烦心事&a…

Phonegap在ios7上系统状态栏的问题解决

用Phonegapjqm开发的应用,在ios6下没问题,但是在ios7下会出现如下系统状态栏和header重合的问题,搜索了一下,发现这其实是 phonegap当前版本的一个已知问题,通过修改./platforms/ios/whhe/Classes /MainViewController…

php对角线数组代码,php数组内容查找代码

Array([0] > Array([id] > 6[title] > 凤凰[bid] > 2)[1] > Array([id] > 5[title] > 年康[bid] > 2)[2] > Array([id] > 4[title] > 海鸥[bid] > 2)[3] > Array([id] > 3[title] > 111cn.net[bid] > 1)[4] > Array([id] &…

JQuery合并表格单元格

转:http://www.cnblogs.com/xuguoming/p/3412124.html JQuery合并表格单元格 一、需求 如果存在一个表格,想把其中某一列内容相同的部分合并单元格,用JQ动态如何操作,原始表格如下: 合并单元格之后的表格如下&#xff…

[音视频]H264码流分析工具

[音视频]H264码流分析工具 CTI-TS EasyICE Elecardstreameyetools VideoEye H264VideoESViewer 学习H264码流,H264码流进行分析 http://blog.csdn.net/leixiaohua1020/article/details/17933821 H264BSAnalyzer https://github.com/latelee/H264BSAnalyzer.g…

手机型号识别 手机PID UID 驱动识别 数据库包

主要用在手机驱动识别,列如手机助手开发,都需要用到这个.QQ9711-5034 整套数据库以及源码包含如下: 1) 包含1160 张手机外壳图片,78 个手机驱动文件。 2) 支持192 个品牌,2293 款手机,还有山寨机没有统计进…

php yii 表单title,Yii2.0-ActiveForm表单结构自定义教程

应用实例:use yii\bootstrap\ActiveForm;$form ActiveForm::begin([layout > horizontal]);// 隐藏form的标签echo $form->field($model, demo, [inputOptions > [placeholder > $model->getAttributeLabel(demo),],])->label(false);// 内联 radio listech…

Chart.js学习

一、简介 Chart.js是一个基于HTML5的简单的面向对象的图表库,支持包括IE7和8的所有现代浏览器。图表库中有6种表,分别是:曲线图(Linecharts)、柱状图(Barcharts)、雷达图(Radarchart…

php 关闭电脑,php实现用手机关闭计算机(电脑)的方法

本文实例讲述了php实现用手机关闭计算机(电脑)的方法。分享给大家供大家参考。具体分析如下:适合有手机和电脑,用wifi的php web开发。方便关闭你的电脑(尤其在你想睡觉时 ),适合局域网用法:放在你的web项目文件夹,可以…

mysql数据库常用备份、恢复命令

转自&#xff1a;http://blog.csdn.net/bxbx258/article/details/2945832 还原一个数据库:mysql -h localhost -u root -p123456 www<c:/www.sql 备份一个数据库:mysqldump -h localhost -u root -p123456 www > d:/www2008-2-26.sql **********************************…

oracle的标准写法,oracle 表连接特有写法与标准写法

oracle里表连接支持标准写法&#xff0c;但也有oracle特殊的写法&#xff0c;这两种写法在某些场景下会有差异&#xff0c;推荐使用标准写法&#xff0c;这里只是介绍表连接标准语法及了解oracle的特殊写法。标准连接语法&#xff1a;select table1.column , table2.columnfrom…

2013款MacBook Air装Windows7单系统

经过两天的摸索&#xff0c;查找无数资料终于把2013款的MacBook Air装上了WIN 7&#xff0c;虽然网上有很多的资料但是都不是我想要的&#xff0c;第一个我的是2013款的MacBook Air&#xff0c;跟原来2012 11款MacBook Air完全不一样&#xff0c;2013款MacBook Air需要usb3的芯…

linux中oracle创建用户,linux中 oracle 创建用户和表空间以及授权

1、创建临时表空间select name from v$tempfile; 查出当前数据库临时表空间&#xff0c;主要是使用里面的存放路径&#xff1b;创建临时表空间&#xff1a;create temporary tablespace teest_temp tempfile 临时表空间路径/test_temp.dbf size 100m reuse autoextend…

测试报告

本团队积极践行敏捷开发原则&#xff0c;边开发边测试&#xff0c;将测试贯穿在开发过程的始终。在整个过程中测试人员与开发人员保持着密切的沟通&#xff0c;尽最大努力地完成了本次软件开发的测试任务。由于本软件采用游戏引擎开发&#xff0c;与vs的单元测试有冲突&#xf…

php将图片导入,php中图片文件的导入,上传与下载

---------------------------------------------图片的导入-------------------------------------------------------------------图片的上传与下载上传图片:序号图片添加时间操作//打开目录$diropendir("./images");//遍历目录$i;while($freaddir($dir)){if($f!&qu…