存储过程与函数

存储过程与函数

  • 1. 存储过程的定义
  • 2. 存储过程的创建
  • 3. 存储过程的操作
    • 3.1 存储过程的调用
    • 3.2 存储过程的查看
      • 3.2.1 SHOW PROCEDURE STATUS查看存储过程的状态
      • 3.2.2 SHOW CREATE PROCEDURE 查看存储过程的信息
      • 3.2.3 INFORMATION_SCHEMA.ROUTINES查看存储过程的信息
    • 3.3 存储过程的删除
  • 4. 自定义函数
    • 4.1 自定义函数的创建
    • 4.2 自定义函数的调用
    • 4.3 变量
      • 4.3.1 定义变量
      • 4.3.2 变量赋值
        • 4.3.2.1 变量赋值(1)
        • 4.3.2.2 变量赋值(2)
    • 4.4 流程控制语句
      • 4.4.1 if语句
      • 4.4.2 CASE语句
      • 4.4.3 LOOP语句
      • 4.4.4 LEAVE语句
      • 4.4.5 ITERATE语句
      • 4.4.6 REPEAT语句
      • 4.4.7 WHILE语句
    • 4.5 光标的使用
      • 4.5.1 声明光标
      • 4.5.2 打开光标
      • 4.5.3 使用光标
      • 4.5.4 关闭光标
    • 4.6 定义条件和处理程序
      • 4.6.1 定义条件
      • 4.6.2 定义处理程序

1. 存储过程的定义

存储过程是一组完成特定功能的SQL语句集合
将常用或复杂的工作,预先用SQL语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程

2. 存储过程的创建

语法

CREATE PROCEDURE sp_name([proc_parameter[,...]]) [characteristic] routine_body
  • CREATE PROCEDURE:为创建存储过程关键字
  • sp_name:存储过程名称,默认为存储过程与当前数据库关联。要明确的把子程序与一个给定数据库关联起来,可以在创建子程序的时候指定其名字为db_name.sp_name.
  • proc_parameter:指定存储过程的参数列表。列表形式 如下:其中,IN表示输入参数;type表示参数的类型,该类型可以是MySQL数据库任意类型。
[IN / OUT / INOUT] param_name type
  • characteristics指定存储过程的特性,有以下取值。
    • LANGUAGE SQL: 说明routine_body部分是SQL语句组成的,当前系统支持的语言为SQL,SQL是LANGUAGE特性的唯一值。
    • [NOT] DETERMINISTIC: 指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的,相同的输入是相同的输出;[NOT] DETERMINISTIC表示结果是不确定的,相同的输入得到不同的输出。如果没有指定任意一个值,默认为[NOT] DETERMINISTIC。
    • COUTAINS SQL / NO SQL / READS SQL DATA / MODIFIES SQL DATA: 知名子程序使用SQL语句的限制。
      • COUTAINS SQL:表明子程序包含SQL语句,但是不包含读写数据的语句。
      • NO SQL:表明子程序不包含SQL语句
      • READS SQL DATA: 表明子程序包含写数据的语句。
      • 默认情况下,系统会指定为 CONTAINS SQL。
    • SQL SECURITY {DEFINER / INVOKER}: 指明谁有权限来执行。DEFINER表示只有定义者才能执行;INVOKER表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER。
    • COMMENT ‘string’:注释信息,可以用来描述存储过程或函数。
  • routine_body是SQL代码的内容,可以用BEGIN…END来表示SQL代码的开始和结束。
CREATE PROCEDURE pro_emp(in deptno int)
BEGIN
SELECT *
FROM emp
WHERE dno=deptno;
END

deptno:输入参数

CREATE PROCEDURE count_emp(out cc int)
BEGIN
SELECT COUNT(empno) into cc
FROM emp
WHERE empsex='女';
END

cc为输出类型,接收女雇员的人数。
select count(empno) into cc中的into语句实现了将count(empno)统计信息赋值给输出参数cc。SQL变量名不能和列名一样。如果select … into 语句中包含一个对列的引用,并包含一个与列相同名字的局部变量,MySQL当前把参考解释为一个变量的名字。

3. 存储过程的操作

3.1 存储过程的调用

语法

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

CALL调用存储过程,sp_name是存储过程名称,parameter是存储过程的参数

示例

CREATE PROCEDURE avg_emp(IN deptno INT, OUT avgage FLOAT)
BEGIN
SELECT AVG(empage) INTO avgage
FROM emp
WHERE dno = deptno;
END

CALL avg_emp(1, @aa)

SELECT @avg

3.2 存储过程的查看

3.2.1 SHOW PROCEDURE STATUS查看存储过程的状态

SHOW STATUS语句只能查看存储过程操作哪一个数据库,存储过程的名称,类型,谁定义的,创建和修改时间,字符编码等信息。 不能查询存储过程具体定义

语法

SHOW PROCEDURE STATUS 

你可能感兴趣的:(数据库,sql)