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的 ...
随机推荐
- sql基础知识:分页+排序
Oracle的分页还真是挺恶心地,不像mysql直接Limit就搞定 select name from student limit 0,20; Oracle需要借助rownum实现: select * ...
- [Java面试六]SpringMVC总结以及在面试中的一些问题.
1.简单的谈一下SpringMVC的工作流程? 流程 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理 ...
- Atitit 项目的主体设计与结构文档 v3
Atitit 项目的主体设计与结构文档 v3 1. 实现的目标2 1.1. cross device跨设备(pc 手机 平板)作为规划2 1.2. 企业级Java体系与开发语言2 1.3. 高扩展性, ...
- Linux初学 - SSH
SSH:SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目前较可靠 ...
- salesforce 零基础学习(三十二)通过Streams和DOM方式读写XML
有的时候我们需要对XML进行读写操作,常用的XML操作主要有Streams和DOM方式. 一.Streams方式 Streams常用到的类主要有两个XmlStreamReader 以及XmlStrea ...
- iOS---用LLDB调试,让移动开发更简单(一)
因文章字数超过限制,所以拆分成了上下篇 LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用 ...
- 将http调用返回json中的有关中文的unicode转换为中文
在http调用时获取到的json数据中文是乱码的解决方法: 中文转Unicode:HttpUtility.UrlEncodeUnicode(string str);转换后中文格式:"%uxx ...
- Workflow中InArgument与OutArgument区别
序号 InArgument[In参数] OutArgument[Out参数] 1 可以用VS设计器在xaml中定义[In参数] 可以用VS设计器在xaml中定义[Out参数] 2 在xaml中定义的 ...
- Java基本特征 - 多态
多态的实现方式: 1. 重载(overload):实现编译时的多态性,前绑定 同一个类中.方法名相同.参数类型或者参数数量不相同 重写(override):运行时的多态性,后绑定.运行时的多态,是面向 ...
- Account problem-There may be a problem with your account. Please contact us. Sign out
很多人在使用开发者账号AppleID的时候,都会碰到如下问题 There may be a problem with your account. Please contact us. 登录到苹果的开发 ...