procedure

存储过程

一组为了完成特定功能的预编译Sql语句,存储在数据库中,一次编译后即运行在内存中,以后可以再次调用,效率高

优点:

  • 一次编译,多次调用:编译后书籍存储于内存,可以被后续调用
  • 高效:效率高于一般的sql语句
  • 简化操作:通过把处理封装在容易使用的单元中,简化复杂的操作;
  • 解耦,独立和优化管理:如果表名、列名或业务逻辑有变化。只需要更改存储过程的代码,使用人员无需更改代码;
  • 存储过程有助于减少应用程序和数据库服务器之间的流量:因为应用程序不必发送多个冗长的 SQL 语句,而只用发送存储过程的名称和参数;
  • 存储的程序是安全的:数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向基础数据库表提供任何权限。

语法:

  • 创建:CREATE PROCEDURE 过程名 (参数列表) [characteristic ...] 
  • 修改:ALTER PROCEDURE 过程名 [characteristic ...]
  • 删除:DROP PROCEDURE [IF EXISTS] 过程名
  • 调用:CALL 过程名(参数列表)//如果过程里面有select out参数;则call即可返回out参数,否则再调用一次select out参数
  • 定义: declare 变量名 数据类型 default value;
  • 全局变量:set @变量名 = value,直接将@变量放入存储过程的参数列表使用,也可以直接传参数
  • delimiter $ 设置结束标记
  • end $ 结束

【注:】参数列表里的参数:in,out或者inout。其中out和input必须是@变量(也就是声明变量或者全局变量)

举例:

//例一
set @i = 1;

delimiter $
create procedure test(out o int)
begin
declare innera int default 1;
declare innerb int default 1;
while innera<=10 do
set innera = innera + 1;
set innerb = innera;
end while;
set o = innera;
end $
 
call test(@i);
select @i;


//例二
delimiter $
create procedure test(in i int)
begin
declare innera int default 1;
declare innerb int default 1;
while innera<=10 do
set innera = innera + 1;
set innerb = innera;
end while;
select i;
end $

call test(@i);

//例三
delimiter $
create procedure test(inout o int)
begin
declare innera int default 1;
declare innerb int default 1;
while innera<=10 do
set innera = innera + 1;
set innerb = innera;
end while;
set o = innera;
select @i;
end $

call test(@i);

流程控制语句

1、IF 语句包含多个条件判断,根据结果为 TRUE、FALSE 执行语句,与编程语言中的 if、else if、else 语法类似。例如:
输入一个整数,使用 if 语句判断是正数还是负数,代码如下所示:

– 创建过程
delimiter $;
create procedure mypro2(in num int)
begin
if num<0 then – 条件开始
select ‘负数’;
elseif num=0 then
select ‘不是正数也不是负数’;
else
select ‘正数’;
end if;-- 条件结束
end $;
– 调用过程
call mypro2(-1);

2、case 是另一个条件判断的语句,类似于编程语言中的 choose、when 语法。MySQL 中的 case 语句有两种语法格式。例如:
输入一个整数,使用 case 语句判断是正数还是负数,代码如下所示:

– 创建过程
delimiter $
create procedure mypro3(in num int)
begin
case – 条件开始
when num<0 then select ‘负数’;
when num=0 then select ‘不是正数也不是负数’;
else select ‘正数’;
end case; – 条件结束
end $;
– 调用过程
call mypro3(1);

3、while 语句的用法和 java 中的 while 循环类似。例如:
定义存储过程,使用 while 循环输出 1 到 10 的累加和,代码如下所示:

– 创建过程
delimiter $
create procedure mypro5(out sum int)
begin
declare num int default 0;
set sum = 0;
while num<10 do – 循环开始
set num = num+1;
set sum = sum+num;
end while; – 循环结束
end $;
– 调用过程
call mypro5(@sum);
– 查询变量值
select @sum;

存储过程的管理

1、显示所有库的存储过程 :SHOW PROCEDURE STATUS;

2、显示特定数据库的存储过程:SHOW PROCEDURE status where db = ‘schooldb’;

3、显示名称中包含“my”的存储过程:SHOW PROCEDURE status where name like ‘%my%’;

4、显示存储过程源码:SHOW CREATE PROCEDURE mypro1;

5、删除存储过程 :drop PROCEDURE mypro1;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`PROCEDURE` 是 MySQL 中用于创建存储过程的关键字。存储过程是一组预先编写好的 SQL 语句集合,可以在需要的时候执行。使用存储过程可以将常用的 SQL 语句封装起来,方便重复使用,并且可以提高 SQL 执行效率。 创建存储过程的语法如下: ``` CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name param_type characteristic: COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } routine_body: valid_sql_statement ``` 其中,`sp_name` 是存储过程的名称,`proc_parameter` 是存储过程的参数列表,`characteristic` 是存储过程的特性,`routine_body` 是存储过程的主体部分,包括一系列有效的 SQL 语句。 例如,下面的示例代码创建一个名为 `get_customer` 的存储过程,它接受一个客户 ID 作为输入参数,然后从 `customers` 表中检索出该客户的信息: ``` CREATE PROCEDURE get_customer (IN customer_id INT) BEGIN SELECT * FROM customers WHERE id = customer_id; END; ``` 在这个例子中,`IN customer_id INT` 指定了一个输入参数 `customer_id`,它的类型为 `INT`。`SELECT` 语句用于检索出指定客户 ID 的信息。该存储过程可以在需要的时候调用,例如: ``` CALL get_customer(123); ``` 这将检索出客户 ID 为 123 的客户信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值