1.存储过程简介(考试专用的废话)
存储过程是一组为完成特定功能的SQL语句集,经编译后存储在数据库中,用户可以通过给定的存储过程名称和参数(如果该存储过程带有参数)执行。
①存储过程执行速度更快
②存储过程减少网络流量
③存储过程被当做安全机制,被充分利用
2.创建存储过程
语法 CREATE PROCEDURE sp_name ([ proc_parameter ]) [ characteristics..] routine_body
proc_parameter指定存储过程的参数列表,列表形式如下: [IN|OUT|INOUT] param_name type
其中in表示输入参数,out表示输出参数,inout表示既可以输入也可以输出;
param_name表示参数称;type表示参数的类型,该类型可以是MYSQL数据库中的任意类型
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
LANGUAGE SQL :说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL,SQL是LANGUAGE特性的唯一值
[NOT] DETERMINISTIC :指明存储过程执行的结果是否正确。DETERMINISTIC 表示结果是确定的。每次执行存储过程时,相同的输入会得到
相同的输出。
[NOT] DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为[NOT] DETERMINISTIC
CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA:指明子程序使用SQL语句的限制。
CONTAINS SQL表明子程序包含SQL语句,但是不包含读写数据的语句;
NO SQL表明子程序不包含SQL语句;
READS SQL DATA:说明子程序包含读数据的语句;
MODIFIES SQL DATA表明子程序包含写数据的语句。
默认情况下,系统会指定为CONTAINS SQL
SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。DEFINER 表示只有定义者才能执行
INVOKER 表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER
COMMENT 'string' :注释信息,可以用来描述存储过程或函数
routine_body:
Valid SQL procedure statement or statements
routine_body是SQL代码的内容,可以用BEGIN...END来表示SQL代码的开始和结束
3.别要被上面的定义吓到,那都是理论,实践出真知。好,我们来一个简单的存储过程,Let·s Go
delimiter $$ create procedure proc1(out s int) begin select count(*) into s from person; end $$ delimiter ;
说明:
①这里使用了delimiter,表示分隔符的意思。在Mysql中默认使用“;”做为分隔符。如果我们没有声明,编译器会把存储过程当成sql语句进行处理,那么存储过程的编译就会报错。所以要事先使用delimiter声明分割符,这样编译器才会将“;”当成存储过程的代码,用完之后在还原分隔符。
②存储过程有时需要输入,输出,输入输出参数。此例使用输出参数s,类型为int。如果有多个参数用逗号分开
③begin和end标识过程体的开始和结束
是不是很简单,好的继续
4.存储过程的参数
CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
mysql> set @s=0; Query OK, 0 rows affected (0.00 sec) mysql> call proc1(@s); Query OK, 1 row affected (0.10 sec) mysql> select @s; +------+ | @s | +------+ | 5 | +------+ 1 row in set (0.00 sec)
OUT 输出参数:该值可在存储过程内部被改变,并可返回【参照IN】
INOUT 输入输出参数:调用时指定,并且可被改变和返回【参照IN】
5.定义变量
DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
其中,datatype为MySQL的数据类型,如:int, float, date, varchar(length)
DECLARE l_int int unsigned default 4000000;
DECLARE l_numeric number(8,2) DEFAULT 9.95;
DECLARE l_date date DEFAULT '1999-12-31';
DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';
DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';
变量赋值
SET 变量名 = 表达式值 [,variable_name = expression ...]
6.存储过程的调用
用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数【call proc1(@S)】
7.存储过程的查询
可用 select name from mysql.proc where db=’数据库名’;【存储过程和函数】
或者 select routine_name from information_schema.routines where routine_schema='数据库名';【存储过程和函数】
或者 show procedure status where db='数据库名';【存储过程】
查看当前存储过程的详细,可以使用
SHOW CREATE PROCEDURE 数据库.存储过程名;
8 修改存储过程
ALTER PROCEDURE
更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。
9 存储过程的删除
删除一个存储过程比较简单,和删除表一样:
DROP PROCEDURE
从MySQL的表格中删除一个或多个存储过程
10 存储过程的控制语句
(1). 变量作用域
内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
给会话变量来保存其值。
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc3()
-> begin
-> declare x1 varchar(5) default 'outer';
-> begin
-> declare x1 varchar(5) default 'inner';
-> select x1;
-> end;
-> select x1;
-> end;
-> //
mysql > DELIMITER ;
(2). 条件语句
Ⅰ. if-then -else语句
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc2(IN parameter int)
-> begin
-> declare var int;
-> set var=parameter+1;
-> if var=0 then
-> insert into t values(17);
-> end if;
-> if parameter=0 then
-> update t set s1=s1+1;
-> else
-> update t set s1=s1+2;
-> end if;
-> end;
-> //
mysql > DELIMITER ;
Ⅱ. case语句:
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc3 (in parameter int)
-> begin
-> declare var int;
-> set var=parameter+1;
-> case var
-> when 0 then
-> insert into t values(17);
-> when 1 then
-> insert into t values(18);
-> else
-> insert into t values(19);
-> end case;
-> end;
-> //
mysql > DELIMITER ;
(3). 循环语句
Ⅰ. while ···· end while:
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc4()
-> begin
-> declare var int;
-> set var=0;
-> while var<6 do
-> insert into t values(var);
-> set var=var+1;
-> end while;
-> end;
-> //
mysql > DELIMITER ;
Ⅱ. repeat···· end repeat:
它在执行操作后检查结果,而while则是执行前进行检查。
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc5 ()
-> begin
-> declare v int;
-> set v=0;
-> repeat
-> insert into t values(v);
-> set v=v+1;
-> until v>=5
-> end repeat;
-> end;
-> //
mysql > DELIMITER ;
Ⅲ. loop ·····end loop:
loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc6 ()
-> begin
-> declare v int;
-> set v=0;
-> LOOP_LABLE:loop
-> insert into t values(v);
-> set v=v+1;
-> if v >=5 then
-> leave LOOP_LABLE;
-> end if;
-> end loop;
-> end;
-> //
mysql > DELIMITER ;
Ⅳ. LABLES 标号:
标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
(4). ITERATE迭代
Ⅰ. ITERATE:
通过引用复合语句的标号,来从新开始复合语句
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc10 ()
-> begin
-> declare v int;
-> set v=0;
-> LOOP_LABLE:loop
-> if v=3 then
-> set v=v+1;
-> ITERATE LOOP_LABLE;
-> end if;
-> insert into t values(v);
-> set v=v+1;
-> if v>=5 then
-> leave LOOP_LABLE;
-> end if;
-> end loop;
-> end;
-> //
mysql > DELIMITER ;
SqlServer存储过程: http://www.cnblogs.com/knowledgesea/archive/2013/01/02/2841588.html
相关推荐
MySQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集,它可以被命名、保存并在需要时调用,极大地提高了数据库开发效率和程序的可维护性。在Java应用程序中,我们经常使用JDBC(Java Database ...
MySQL存储过程是一种在MySQL数据库中通过定义一系列操作来执行特定任务的程序代码集合。它允许用户封装一系列SQL语句,提高代码的复用性,并且可以通过参数传递,提高数据处理的灵活性。本实例教程将详细介绍如何在...
在存储过程中,变量的值可能随着流程的推进而变化,理解这些变化对于找出潜在问题至关重要。"Debugger for MySQL"支持实时查看和跟踪变量值,帮助开发者追踪数据流,定位错误源头。 此外,该工具可能还具备其他辅助...
在存储过程中,使用了“declare exit handler for 1329 set state='error'”语句来处理特定的SQL异常,这里异常代码1329表示尝试访问不存在的游标。当这种异常发生时,将状态变量设置为'error'。利用异常处理机制...
四、存储过程中的控制结构 1. 条件语句:`IF...ELSE`和`CASE`用于实现条件判断。 2. 循环语句:`WHILE`和`REPEAT`用于实现循环操作。 3. 退出语句:`LEAVE`用于跳出循环或整个存储过程。 4. 继续语句:`CONTINUE`...
本实例展示了如何在MySQL存储过程中实现异常处理,以捕获并处理可能出现的错误。 首先,我们注意到在创建存储过程`myProc`时,使用了`delimiter $$`来改变MySQL客户端的语句分隔符,这是为了在存储过程中使用多个...
在存储过程中,还可以使用条件语句(如IF-ELSE)和循环结构(如WHILE或LOOP),使得处理逻辑更加灵活。 接下来,我们讨论触发器。触发器是一种特殊的存储过程,它在特定的数据库事件(如INSERT、UPDATE或DELETE)...
在这个存储过程中,我们传入了页码(page)、每页大小(pageSize)两个参数,并返回总行数(totalRows)。先计算出起始行号(rowCount),然后执行实际的分页查询。 调用这个存储过程可以使用以下代码: ```sql ...
5. **错误处理和日志记录**:在存储过程中,应当包含适当的错误处理机制,如`BEGIN...TRY...END TRY...BEGIN CATCH...END CATCH`块,以及日志记录,以便跟踪备份过程的状态和可能出现的问题。 6. **还原数据**:当...
c++实现调mysql存储过程,实现存储过程的出参入参,可以支持查询多数据返回,还有存储过程的复杂数据的增删改等
Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三...
MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...
#### 二、MySQL存储过程的基本概念 在了解如何导出存储过程之前,我们先来简要回顾一下存储过程的一些基本概念: - **定义**:存储过程是一组预编译的SQL语句,可以接受输入参数,返回输出参数或结果集,并且可以在...
MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列的SQL语句,形成一个可重复使用的代码块,以提高数据处理的效率和应用程序的性能。在这个"MySQL存储过程学习"的主题中,我们将深入探讨...
通过上述示例,我们可以看到,使用MySQL存储过程实现分页查询不仅能够提高查询效率,还能简化应用程序逻辑,增强系统的可维护性和可扩展性。然而,设计存储过程时也需要注意安全性,避免SQL注入等风险,确保数据库...
通过阅读这份教程,读者可以学习如何创建、修改、删除存储过程,理解如何在存储过程中使用变量、游标、事务控制,以及如何优化存储过程的性能。 存储过程的使用有助于数据库的安全性,因为它可以限制对数据的直接...
MySQL存储过程是数据库管理系统中的一个重要特性,它允许程序员或数据库管理员预先定义一组SQL语句,形成一个可重用的逻辑单元。在这个“MySQL存储过程入门到精通”资料中,你将深入理解存储过程的原理、创建、调用...
MySQL 存储过程编程是指在 MySQL 数据库中使用存储过程来实现业务逻辑的编程技术。存储过程是一种可以在数据库中存储和执行的程序单元,它可以实现复杂的业务逻辑和数据处理操作。 在 MySQL 5.0 中,存储过程的...
最后,"mysql存储过程.pdf"专注于MySQL的存储过程。存储过程是预编译的SQL语句集合,可以提高数据库操作的性能,减少网络流量,并增强数据安全。在PDF文档中,你将学习如何定义、调用和管理存储过程,以及如何使用...
- **错误检查**:在存储过程中加入错误检查和异常处理机制,提高程序的稳定性和可靠性。 - **资源管理**:合理管理数据库连接和内存资源,避免资源泄漏和性能瓶颈。 总之,MySQL5.0中的存储过程功能极大地丰富了...