mysql5.7的存储过程,MySQL5.7从入门到精通-------存储过程与存储函数(3)

10.2.1  调用存储过程

存储过程必须使用CALL语句来调用。如果要调用其它数据库的存储过程,需要指定数据库名称。例如 CALL dbname.spname

DROP TABLE IF EXISTS t_student;

CREATE TABLE t_student

(

id INT(11) PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(255) NOT NULL,

age INT(11),

address VARCHAR(255),

sex CHAR(2)

);

INSERT INTO t_student VALUES(NULL,'大宇',22,'苏州','男');

INSERT INTO t_student VALUES(NULL,'小宇',20,'盐城','男');

INSERT INTO t_student VALUES(NULL,'小雨',20,'盐城','女');

12537DELIMITER // --存储过程分隔符设定为//

CREATE PROCEDURE CountStu(IN stu_sex CHAR,OUT num INT) --stu_sex表示输入,num表示输出

BEGIN

SELECT COUNT(*) INTO num FROM t_student WHERE sex = stu_sex; --结果存入num,条件用上变量

END // --以指定分隔符结束存储过程

DELIMITER ; --存储过程分隔符设定为;CALL CountStu('男',@num);

SELECT @num;

-- 本质为执行下面的SQL:

SELECT COUNT(*) AS @num

FROM t_student WHERE sex = '男';

12537CALL CountStu('女',@num);

SELECT @num;

12537

尝试传入的其它的数据CALL CountStu('3',@num);

SELECT @num;

12537

10.2.2  调用存储函数

存储函数不需要使用CALL关键字。另外,存储函数的参数类型默认为IN输入。DELIMITER //

CREATE FUNCTION countStu2(stu_sex CHAR) -- 默认是IN,OUT、INOUT不支持。效果是IN,但是不能加上IN

RETURNS INT

RETURN (SELECT COUNT(*) FROM t_student WHERE sex = stu_sex); // -- 不加结束标记,运行失败

DELIMITER ;SELECT countStu2('男');

12537

如果SQL语句较为复杂,下面加上BEGIN与END的写法更佳。DELIMITER //

CREATE FUNCTION countStu2(stu_sex CHAR) -- 默认是IN,OUT、INOUT不支持。效果是IN,但是不能加上IN

RETURNS INT -- 定义返回值类型

BEGIN

RETURN (复杂的SQL);

END // -- 结束标记代表的是存储过程定义的结束。而不是不懂装懂的把结束标记放在SQL结尾

DELIMITER ;

10.3.1  使用SHOW STATUS 查看存储过程或函数的状态SHOW PROCEDURE STATUS LIKE 'C%';

12537SHOW FUNCTION STATUS LIKE 'C%';

12537

知道了存储过程,如果希望查看具体的存储过程或者存储函数的定义。SHOW CREATE PROCEDURE study.CountStu;

-- Create Procedure 列为核心语句

CREATE DEFINER=`root`@`localhost` PROCEDURE `CountStu`(IN stu_sex CHAR,OUT num INT)

BEGIN

SELECT COUNT(*) INTO num FROM t_student WHERE sex = stu_sex;

END

12537

查看存储函数有哪些。SHOW FUNCTION STATUS LIKE 'C%'

12537

查看具体的存储函数创建语句。SHOW CREATE FUNCTION study.countStu2

-- Create Function 列的语句

CREATE DEFINER=`root`@`localhost` FUNCTION `countStu2`(stu_sex CHAR)

RETURNS int(11)

RETURN (SELECT COUNT(*) FROM t_student WHERE sex = stu_sex)

12537

10.3.3  从information_schema.Routines 表中查询存储过程与函数(了解)

原来,MySQL中的存储过程与存储函数都存放在information_schema数据库下的Routines表中。SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME LIKE 'C%'

12537

10.4.1  修改存储过程

语法:ALTER  PROCEDURE |  FUNCTION  sp_name [ 存储特性 ]修改存储过程,将读写权限改为 MODIFIES SQL DATE 并指明调用者

ALTER PROCEDURE countStu2

MODIFIES SQL DATE -- 表示子程序中包含写数据的语句

SQL SECURITY INVOKER -- 表示调用者才能执行

12537

10.5.1  删除存储过程

删除存储过程语法:DROP  PROCEDURE [ IF EXISTS ] sp_name;

删除存储函数语法:DROP  FUNCTION     [ IF EXISTS ] function_name;SHOW PROCEDURE STATUS LIKE 'C%'

12537DROP PROCEDURE IF EXISTS study.CountTec; -- 删除study库下的名为CountTec存储过程

SHOW PROCEDURE STATUS LIKE 'c%' --再次查看有哪些存储过程

12537

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值