MySQL带参数的存储过程小例子
http://wwty.iteye.com/blog/698239
mysql存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现
语法如下:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: CONTINUE | EXIT condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
Handlers类型:
1, EXIT: 发生错误时退出当前代码块(可能是子代码块或者main代码块)
2, CONTINUE: 发送错误时继续执行后续代码
condition_value:
condition_value支持标准的SQLSTATE定义;
SQLWARNING是对所有以01开头的SQLSTATE代码的速记
NOT FOUND是对所有以02开头的SQLSTATE代码的速记
SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记
除了SQLSTATE值,MySQL错误代码也被支持
但是对于mysql而言,优先级如下:
MySQL Error code > SQLSTATE code > 命名条件
使用SQLSTATE还是MySQL Error Code?
1,SALSTATE是标准,貌似会更portable,但是实际上MySQL、DB2、Oracle等等的存储程序语法大相径庭,所以portable的优势不存在
2,MySQL error code与SQLSTATE并不是一一对应的,比如很多MySQL error code都映射到同一SQLSTATE code(HY000)
当MySQL客户端碰到错误时,它会报告MySQL error code和相关的SQLSATE code:
mysql > CALL nosuch_sp();
ERROR 1305 (42000): PROCEDURE sqltune.nosuch_sp does not exist
具体的sqlsdate和mysql error code的对应可以在http://dev.mysql.com/doc/的MySQL reference manual的附录B找到完整的最新的error codes
condition_name:命名条件
MySQL error code或者SQLSTATE code的可读性太差,所以引入了命名条件:
语法:
- DECLARE condition_name CONDITION FOR condition_value
- condition_value:
- SQLSTATE [VALUE] sqlstate_value
- | mysql_error_code
使用:
- # original
- DECLARE CONTINUE HANDLER FOR 1216 MySQL_statements;
- # changed
- DECLARE foreign_key_error CONDITION FOR 1216;
- DECLARE CONTINUE HANDLER FOR foreign_key_error MySQL_statements;
用condition_name为错误代码起了个别名。
示例1:Duplicate entry Handler
- CREATE PROCEDURE sp_add_location
- (in_location VARCHAR(30),
- in_address1 VARCHAR(30),
- in_address2 VARCHAR(30),
- zipcode VARCHAR(10),
- OUT out_status VARCHAR(30))
- BEGIN
- DECLARE CONTINUE HANDLER
- FOR 1062
- SET out_status='Duplicate Entry';
- SET out_status='OK';
- INSERT INTO locations
- (location,address1,address2,zipcode)
- VALUES
- (in_location,in_address1,in_address2,zipcode);
- END;
示例2: Last Row Handler
- CREATE PROCEDURE sp_not_found()
- READS SQL DATA
- BEGIN
- DECLARE l_last_row INT DEFAULT 0;
- DECLARE l_dept_id INT:
- DECLARE c_dept CURSOR FOR
- SELECT department_id FROM departments;
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row=1;
- OPEN c_dept;
- dept_cursor: LOOP
- FETCH c_dept INTO l_dept_id;
- IF (l_last_row=1) THEN
- LEAVE dept_cursor;
- END IF;
- END LOOP dept_cursor;
- CLOSE c_dept;
- END;
综合示例:
- CREATE PROCEDURE sp_add_department
- (p_department_name VARCHAR(30),
- p_manager_surname VARCHAR(30),
- p_manager_firstname VARCHAR(30),
- p_location VARCHAR(30),
- OUT p_sqlcode INT,
- OUT p_status_message VARCHAR(100))
- BEGIN
- /* START Declare Conditions */
- DECLARE duplicate_key CONDITION FOR 1062;
- DECLARE foreign_key_violated CONDITION FOR 1216;
- /* END Declare COnditions */
- /* START Declare variables and cursors */
- DECLARE l_manager_id INT;
- DECLARE csr_mgr_id CURSOR FOR
- SELECT employee_id FROM employees
- WHERE surname=UPPER(p_manager_surname)
- AND firstname=UPPER(p_manager_firstname);
- /* END Declare variables and cursors */
- /* START Declare Exception Handlers */
- DECLARE CONTINUE HANDLER FOR duplicate_key
- BEGIN
- SET p_sqlcode=1052;
- SET p_status_message='Duplicate key error';
- END;
- DECLARE CONTINUE HANDLER FOR foreign_key_violated
- BEGIN
- SET p_sqlcode=1216;
- SET p_status_message='Foreign key violated';
- END;
- DECLARE CONTINUE HANDLER FOR NOT FOUND
- BEGIN
- SET p_sqlcode=1329;
- SET p_status_message='No record found';
- END;
- /* END Declare Exception Handlers */
- /* START Execution */
- SET p_sqlcode=0;
- OPEN csr_mgr_id;
- FETCH csr_mgr_id INTO l_manager_id;
- IF p_sqlcode<>0 THEN /* Failed to get manager id */
- SET p_status_message=CONCAT(p_status_message,' when fetching manager id');
- ELSE /* Got manager id, we can try and insert */
- INSERT INTO departments (department_name, manager_id, location)
- VALUES(UPPER(p_department_name), l_manager_id, UPPER(p_location));
- IF p_sqlcode<>0 THEN /* Failed to insert new department */
- SET p_status_message=CONCAT(p_status_message, ' when inserting new department');
- END IF;
- END IF;
- CLOSE csr_mgr_id;
- /* END Execution */
- END
MySQL带参数的存储过程小例子的更多相关文章
- c#调用Mysql带参数的存储过程
1.首先创建一个带参数的存储过程 ①存储过程名称=proc_bookinfo ②存储过程2个参数 一个in 一个out in参数名称=ispay out参数名称=unPaycount ③ 这个存储过 ...
- C# 调用Mysql 带参数存储过程
使用C#调用Mysql 带参数的存储过程: 1.创建带参数的存储过程:USP_Temp_Test 2.两个参数:IN 参数为 P_XML , OUT 参数为 P_ErrorOut 3.C#代码调用该存 ...
- Sql Server 带参数的存储过程执行方法
Sql Server 带参数的存储过程执行方法 Visual C# 动态操作 SQL Server 数据库实例教程(4):带参数的存储过程执行方法 上一篇文章介绍了带参数的SQL语句执行方法和不带参数 ...
- [转]SSIS OLE DB Source中执行带参数的存储过程
本文转自:http://www.cnblogs.com/michaelxu/archive/2009/10/21/1587450.html 问题描述:执行一个存储过程得到一个多条记录的结果集,然后循环 ...
- oracle存储过程(带参数的存储过程)
带参数的存储过程 举例:为指定的员工涨100元的工资,打印涨前和涨后的工资 如果带参,需要指定是输入参数还是输出参数 create or replace procedure raisesalary(e ...
- oracle无参数和带参数的存储过程实例
SQL中调用存储过程语句:call procedure_name(); 注:调用时”()”是不可少的,无论是有参数还是无参数. 定义对数据库存储过程的调用时1.无参数存储过程:{call proced ...
- 在C#中怎么调用带参数的存储过程啊??
1)执行一个没有参数的存储过程的代码如下:SqlConnection conn=new SqlConnection(“connectionString”);SqlDataAdapter da = ne ...
- Mysql 存储过程小例子
创建存储过程: DELIMITER $$ USE `database_name`$$ DROP PROCEDURE IF EXISTS `add_or_update_user`$$ )) BEGIN ...
- 带参数的存储过程和标量Function
在SQL Server中,我们通常会使用NEWID(),GETDATE(),等一些数据库函数,这些函数是很有帮助的,然后数据库也能够让我们自己写函数,即Function,下面简单说说Function的 ...
随机推荐
- GUID相关知识
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想 ...
- 3.实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty 和Staff。
23.实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty 和Staff. 具体要求如下: (1)Person类中的属性有:姓名name(String类型) ...
- Fiddler (六) 最常用的快捷键
使用QuickExec Fiddler2成了网页调试必备的工具,抓包看数据.Fiddler2自带命令行控制,并提供以下用法. Fiddler的快捷命令框让你快速的输入脚本命令. 键盘快捷键 按ALT+ ...
- spring 学习
一.spring框架介绍 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供 ...
- Jenkins的系统设置
1.登录Jenkins进入以下界面: 2.点击 系统管理 3.点击 系统设置 (下图的系统设置是已经设置好的) 4.这里设置主要设置 Jenkins URL (这里我是测试的所以使用默认的)与 邮件的 ...
- Update: ELCImagePickerController
March 3rd, 2011 Posted by: Matt Tuzzolo - posted under:Articles » Featured I recently spent some tim ...
- hdu2066一个人的旅行(多源点多汇点的最短路径问题)
/* 思路:多源点,多会点的最短路径! 将最小号-1的节点但最源点,将最大号+1的点当作汇点! 将问题转变成从一个源点到一个汇点的最短路径的问题! 开始忘记初始化vector了,哇了好多次....坑爹 ...
- 后端码农谈前端(CSS篇)第五课:CSS样式
一.背景: CSS 允许应用纯色作为背景,也允许使用背景图像创建相当复杂的效果. 1.背景色 可以使用 background-color 属性为元素设置背景色.这个属性接受任何合法的颜色值. 例如: ...
- Unity3D 中的三个Update()方法
MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当Mo ...
- ASP.NET 程序提交表单数据中带有html标签不能提交或者提交报错问题
今天在公司做另外的一个项目,又奇葩的遇到一个问题. 在本地自己电脑上怎么测试都是正常的.但是先上服务器就出问题: 用富文本编辑器上传一篇文章,始终报错,又没提示具体什么错误,也没说代码错误,点击提交按 ...