`

Mysql中存储过程

 
阅读更多

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调用存储过程

    MySQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集,它可以被命名、保存并在需要时调用,极大地提高了数据库开发效率和程序的可维护性。在Java应用程序中,我们经常使用JDBC(Java Database ...

    mysql存储过程调试工具

    在存储过程中,变量的值可能随着流程的推进而变化,理解这些变化对于找出潜在问题至关重要。"Debugger for MySQL"支持实时查看和跟踪变量值,帮助开发者追踪数据流,定位错误源头。 此外,该工具可能还具备其他辅助...

    mysql中存储过程的实例教程

    “ in nc varchar(50) …… in address varchar(50) ” 表示要向存储过程中传入的参数。 实现过程 ( 1 )通过 PHP 预定义类 mysqli ,实现与 MySQL 数据库 的连接。代码如下: $conn=new mysqli("localhost","root...

    mysql存储过程教程

    四、存储过程中的控制结构 1. 条件语句:`IF...ELSE`和`CASE`用于实现条件判断。 2. 循环语句:`WHILE`和`REPEAT`用于实现循环操作。 3. 退出语句:`LEAVE`用于跳出循环或整个存储过程。 4. 继续语句:`CONTINUE`...

    mysql经典教程+mysql存储过程讲解

    在存储过程中,还可以使用条件语句(如IF-ELSE)和循环结构(如WHILE或LOOP),使得处理逻辑更加灵活。 接下来,我们讨论触发器。触发器是一种特殊的存储过程,它在特定的数据库事件(如INSERT、UPDATE或DELETE)...

    MySql 分页存储过程以及代码调用

    在这个存储过程中,我们传入了页码(page)、每页大小(pageSize)两个参数,并返回总行数(totalRows)。先计算出起始行号(rowCount),然后执行实际的分页查询。 调用这个存储过程可以使用以下代码: ```sql ...

    mysql存储过程——用于数据库的备份与还原

    5. **错误处理和日志记录**:在存储过程中,应当包含适当的错误处理机制,如`BEGIN...TRY...END TRY...BEGIN CATCH...END CATCH`块,以及日志记录,以便跟踪备份过程的状态和可能出现的问题。 6. **还原数据**:当...

    c++实现调mysql存储过程

    c++实现调mysql存储过程,实现存储过程的出参入参,可以支持查询多数据返回,还有存储过程的复杂数据的增删改等

    Mysql存储过程常用语句模板

    Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三...

    MySQL存储过程学习

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列的SQL语句,形成一个可重复使用的代码块,以提高数据处理的效率和应用程序的性能。在这个"MySQL存储过程学习"的主题中,我们将深入探讨...

    MySQL存储过程的异常处理方法

    本文实例讲述了MySQL存储过程的异常处理方法。分享给大家供大家参考。具体如下: mysql&gt; mysql&gt; delimiter $$ mysql&gt; mysql&gt; CREATE PROCEDURE myProc -&gt; (p_first_name VARCHAR(30), -&gt; p_last_name VARCHAR(30)...

    MySQL数据库存储过程

    通过阅读这份教程,读者可以学习如何创建、修改、删除存储过程,理解如何在存储过程中使用变量、游标、事务控制,以及如何优化存储过程的性能。 存储过程的使用有助于数据库的安全性,因为它可以限制对数据的直接...

    mysql存储过程实现分页

    mysql存储过程实现分页 mysql存储过程实现分页 mysql存储过程实现分页 mysql存储过程实现分页

    MySQL 存储过程入门到精通

    MySQL存储过程是数据库管理系统中的一个重要特性,它允许程序员或数据库管理员预先定义一组SQL语句,形成一个可重用的逻辑单元。在这个“MySQL存储过程入门到精通”资料中,你将深入理解存储过程的原理、创建、调用...

    MySQL创建存储过程批量插入10万条数据

    MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...

    \MySQL 5.0 存储过程.pdf

    \MySQL 5.0 存储过程.pdf\MySQL 5.0 存储过程.pdf\MySQL 5.0 存储过程.pdf\MySQL 5.0 存储过程.pdf\MySQL 5.0 存储过程.pdf

    MySQL5.0存储过程

    SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。...

    MySQL存储过程 MySQL存储过程

    MySQL存储过程 MySQL存储过程 MySQL存储过程 MySQL存储过程 MySQL存储过程

    mysql中文手册+mysql命令大全+mysql存储过程

    最后,"mysql存储过程.pdf"专注于MySQL的存储过程。存储过程是预编译的SQL语句集合,可以提高数据库操作的性能,减少网络流量,并增强数据安全。在PDF文档中,你将学习如何定义、调用和管理存储过程,以及如何使用...

    存储过程文档--mysql

    存储过程是 MySQL 中的一个强大功能,它允许用户预先将常用的或复杂的工作写入 SQL 语句,并将其存储起来,以便在以后的数据库操作中可以快速调用和执行。存储过程可以提高数据库的执行速度,减少数据库开发人员的...

Global site tag (gtag.js) - Google Analytics