MYSQL 存储过程

MYSQL 存储过程

存储过程(Stored Procedure):在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。

优点:

  • 存储过程可封装,并隐藏复杂的商业逻辑。
  • 存储过程可以回传值,并可以接受参数。
  • 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
  • 存储过程可以用在数据检验,强制实行商业逻辑等。

缺点:

  • 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
  • 存储过程的性能调校与撰写,受限于各种数据库系统。

1. 存储过程的创建与调用

  • 存储过程就是具有名字的一段代码,用来完成一个特定的功能。
  • 创建的存储过程保存在数据库的数据字典中。
/**
	声明语句结束符,可以自定义
**/
DELIMITER $$ 或 DELIMITER //
    
/**
	声明存储过程
**/
CREATE PROCEDURE demo_in_parameter(IN p_in int) 
    
/**
	存储过程开始和结束符号
**/
BEGIN .... END
    
/**
	变量赋值
**/
SET @p_in=1
    
/**
	变量定义
**/
DECLARE l_int int unsigned default 4000000;

/**
	创建mysql存储过程、存储函数
**/
create procedure 存储过程名(参数)
    
/**
	存储过程体
**/
create function 存储函数名(参数)

完整DEMO

mysql> delimiter $$  #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)
    -> BEGIN
    ->   DELETE FROM MATCHES
    ->    WHERE playerno = p_playerno;
    -> END$$
Query OK, 0 rows affected (0.01 sec)
 
mysql> delimiter;  #将语句的结束符号恢复为分号

注意点:默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀。

存储过程体:

  • 存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等
  • 过程体格式:以begin开始,以end结束(可嵌套)
label1: BEGIN
  label2: BEGIN
    label3: BEGIN
      statements; 
    END label3 ;
  END label2;
END label1

标签有两个作用:

  • 1、增强代码的可读性
  • 2、在某些语句(例如:leave和iterate语句),需要用到标签

2. 存储过程的参数

CREATE PROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

注意点:

1、如果过程没有参数,也必须在过程名后面写上小括号:

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) ……

2、确保参数的名字不等于列的名字,否则在过程体中,参数名被当做列名来处理

建议:

  • 输入值使用in参数。
  • 返回值使用out参数。
  • inout参数就尽量的少用。

3. 变量

3.1 变量定义

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];


// 举例
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';

3.2 变量赋值

SET 变量名 = 表达式值 [,variable_name = expression ...]

3.3 用户变量

mysql > SELECT 'Hello World' into @x;  
mysql > SELECT @x;  
+-------------+  
|   @x        |  
+-------------+  
| Hello World |  
+-------------+  
mysql > SET @y='Goodbye Cruel World';  
mysql > SELECT @y;  
+---------------------+  
|     @y              |  
+---------------------+  
| Goodbye Cruel World |  
+---------------------+  
 
mysql > SET @z=1+2+3;  
mysql > SELECT @z;  
+------+  
| @z   |  
+------+  
|  6   |  
+------+

注意点:

  • 1、用户变量名一般以@开头
  • 2、滥用用户变量会导致程序难以理解及管理

4. 注释

  • 单行注释:--
  • 多行注释:C风格
  1. 查询存储过程
selectname from mysql.proc where db='数据库名';


selectroutine_name from information_schema.routines where routine_schema='数据库名';


showprocedure status where db='数据库名';
  1. 查询存储过程详细信息
SHOWCREATE PROCEDURE 数据库.存储过程名;
  1. 修改存储过程
ALTER PROCEDURE
  1. 删除存储过程
DROP PROCEDURE

引用:

https://www.runoob.com/w3cnote/mysql-stored-procedure.html

posted @ 2022-04-04 15:26  生活是很好玩的  阅读(99)  评论(0编辑  收藏  举报