【MySQL】存储过程和函数

 

目录

10.1.1  创建存储过程

10.1.2  创建存储函数

10.1.3  变量的使用

10.1.4  定义条件和处理程序

10.1.5  光标的使用

10.1.6  流程控制的使用

10.2.1  调用存储过程

10.2.2  调用存储函数

10.3.1  SHOW STATUS语句查看存储过程和函数的状态

10.3.2  SHOW CREATE语句查看存储过程和函数的定义

10.3.3  从information_schema.Routines表中查看存储过程和函数的信息

10.4  修改存储过程和函数

10.5  删除存储过程和函数


Delimiter 关键字定义SQL的结束符号,默认是分号‘;’,不好写过程和函数。所以最好在创建过程和函数之前把结束符换一下,比如delimiter //。

10.1.1  创建存储过程

创建存储过程,需要使用CREATE PROCEDURE语句。

CREATE PROCEDURE

       sp_name ( [proc_parameter] )[characteristics ...]

       routine_body


10.1.2  创建存储函数

创建存储过程,需要使用CREATE FUNCTION语句。

CREATE FUNCTION

       func_name ( [func_parameter] )

       RETURNS type [characteristic ...]

       routine_body

 

指定参数为IN, OUT或INOUT只对PROCEDURE是合法的。(FUNCTION中总是默认为IN参数) 。RETURNS子句只能对FUNCTION做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。

 


10.1.3  变量的使用

1.定义(声明)变量

DECLARE var_name[,varname]… date_type [DEFAULT value(没有则Null)];

可以在子程序中声明和使用,作用域为begin…end;

2.为变量赋值

SET var_name = expr [, var_name = expr] ...;可局部/用户/系统类型的变量合并。

MySQL中还可以通过SELECT ... INTO为一个或多个变量赋值,语法如下:

SELECT col_name[,...] INTO var_name[,...] table_expr;


10.1.4  定义条件和处理程序

特定条件需要特定处理。这些条件可以联系到错误,以及子程序中的一般流程控制。定义条件是事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处 ,理方式,并且保证存储过程或函数在遇到警告或错误时能继续执行。这样可以增强存储程序处理问题的能力,避免程序异常停止运行。

 

  1. 定义条件

Declare 条件名 condition for 条件类型(value/code)

2.定义处理程序

       Declare  [ continue | exit | undo ]  handle  for condition_value[,…]  sp_statment

"@var name"表示用户变量,使用SET语句为其赋值,用户变量与连接有关,一个客,户端定义的变量不能被其他客户端看到或使用。当客户端退出时,该客户端连接的所有变,量将自动释放。


10.1.5  光标的使用

查询语句可能返回多条记录,如果数据量非常大,需要在存储过程和储存函数中使用光标来逐条读取查询结果集中的记录。应用程序可以根据需要滚动或浏览其中的数据。光标必须在声明处理程序之前被声明,并且变量和条件还必须在声明光标或处理程序之前被声明。可以将光标存储的查询内容利用函数返回。

 

在过程和函数中使用;

  1. 声明光标

Declare cursor_name COURSOR FOR  查询语句(select_statement);

  1. 打开光标

OPEN cursor_name;

  1. 使用光标

FETCH cursor_name INTO var_name[,…参数名称];

var_name必须在光标定义之前定义好。

4.关闭光标

       CLOSE cursor_name;


10.1.6  流程控制的使用

用来根据条件控制语句的执行。可以使用BEGIN…END构造复杂的控制语句;

  1. IF语句

IF condition THEN 语句1;

        ELSE IF…

        ELSE 语句2;

END IF

 

  • CASE语句

CASE condition

        WHEN value1 THEN 语句1;

        WHEN value2 THEN 语句2;

        [ELSE 语句N]

END CASE

或者

CASE

        WHEN 条件1 THEN 语句1;

        WHEN 条件2 THEN 语句2;

        [ELSE 语句N];

END CASE;

 

  • LOOP语句

[ loop_label: ] LOOP

        语句列;

        [自加减条件 THEN LEAVE LOOP;]

END LOOP [ loop_label ];

 

  • LEAVE语句:用来退出任何被标注的流程构造,如loop_label;

LEAVE label_name;

 

  • ITERATE语句

再次循环,将执行顺序转到语句段开头处;可在LOOP, REPEAT, WHILE内;

ITERATE label;

 

  • REPEAT语句

循环直到条件为真

[repeat_label:] REPEAT

        语句列;

UNTIL 条件

END REPEAT [repeat_label]

 

  •   WHILE语句

条件为真,则循环;

       [while_label:] WHILE 条件 DO

              语句列;

       END WHILE [ while_lable ];

 

10.2.1  调用存储过程

存储过程的调用是通过CALL语句进行调用的。

CALL sp_name([parameter[,...]])

 


10.2.2  调用存储函数

存储函数的使用方法与MySQL内部函数的使用方法是一样的。

 

10.3.1  SHOW STATUS语句查看存储过程和函数的状态

SHOW STATUS语句可以查看存储过程和函数的特征或者状态。

SHOW {PROCEDURE | FUNCTION}    STATUS

       [LIKE 'pattern']

LIKE 语句表示匹配储存过程或者函数的名称


10.3.2  SHOW CREATE语句查看存储过程和函数的定义

SHOW CREATE语句查看存储过程和函数的状态。

SHOW CREATE {PROCEDURE | FUNCTION} sp_name

 

10.3.3  从information_schema.Routines表中查看存储过程和函数的信息

MySQL中存储过程和函数的信息存储在information_schema数据库下的Routines表中。可以通过查询该表的记录来查询存储过程和函数的信息。

SELECT * FROM information_schema.Routines

       WHERE ROUTINE_NAME=' sp_name ' ;

 


10.4  修改存储过程和函数

使用ALTER语句可以修改存储过程或函数的特性。

ALTER {PROCEDURE | FUNCTION}   sp_name [characteristic ...]

特性包括

10.5  删除存储过程和函数

删除存储过程和函数,可以使用DROP语句。

DROP {PROCEDURE | FUNCTION} [IF    EXISTS] sp_name

 

猜你喜欢

转载自blog.csdn.net/dreamengsoul/article/details/83110683