-- 定义一个存储过程
DELIMITER $$
CREATE
PROCEDURE `test`.`demo1`()
-- 存储过程体
BEGIN
-- DECLARE声明 用来声明变量的
DECLARE de_name VARCHAR(10) DEFAULT '';
SET de_name = "jim";
-- 测试输出语句(不同的数据库,测试语句都不太一样。
SELECT de_name;
END$$
DELIMITER ;
-- 调用存储过程
CALL demo1();
-- 查询表product 中type为4的有哪些
DELIMITER $$
CREATE PROCEDURE `test`.`d2`(IN type_param INT,OUT count_param INT)
BEGIN
SELECT COUNT(1) AS count_param FROM product WHERE type = type_param;
SELECT count_param;
END$$
DELIMITER ;
CALL d2(4,@type_param);
-- 流程控制语句 IF ELSE
DROP PROCEDURE IF EXISTS test.d3;
DELIMITER $$
CREATE PROCEDURE test.d3(IN day_param INT)
BEGIN
IF day_param = 0 THEN SELECT '星期天';
ELSEIF day_param = 1 THEN SELECT '星期一';
ELSEIF day_param = 2 THEN SELECT '星期二';
ELSE SELECT '无效日期6';
END IF;
END$$
DELIMITER ;
CALL d3(1);
-- LOOP 循环
-- LEAVE 语句效果对于Java中的break,用来终止循环;
-- ITERATE语句效果相当于Java中的continue,用来跳过此次循环。进入下一次循环。且ITERATE之下的语句将不在进行
DELIMITER $$
CREATE
PROCEDURE d4(IN num INT,OUT SUM INT)
BEGIN
SET SUM = 0;
demo_sum:LOOP-- 循环开始
SET num = num+1;
IF num > 10 THEN
LEAVE demo_sum; -- 结束此次循环
ELSEIF num <= 9 THEN
ITERATE demo_sum; -- 跳过此次循环
END IF;
SET SUM = SUM + num;
END LOOP demo_sum; -- 循环结束
END$$
DELIMITER;
CALL d4(0,@SUM);
SELECT @SUM;
-- 使用存储过程插入信息
DROP PROCEDURE IF EXISTS d5;
DELIMITER $$
CREATE PROCEDURE d5(IN name_param VARCHAR(10),OUT result VARCHAR(20))
BEGIN
-- 声明一个变量 用来决定这个名字是否已经存在
DECLARE s_count INT DEFAULT 0;
SELECT COUNT(*) INTO s_count FROM product WHERE name = name_param;
IF s_count = 0 THEN INSERT INTO product(name,original_price,price,type) VALUES(name_param,6,5,3);
SET result = '数据添加成功!';
ELSE SET result = '该产品已经存在!';
END IF;
SELECT result;
END$$
DELIMITER ;
CALL d5('桌子',@result);
存储过程的管理
显示存储过程
SHOW PROCEDURE STATUS
该查询结果中字段Security_type详解
Security_type主要分为DEFINER 和 INVOKER,主要用以审核调用存储过程的安全审核,如果设置为DEFINER,则创建存储过程的用户需要存在、并且有调用存储过程权限、有访问存储过程里面对象的权限,每次调用都会对definer=root@localhost审核,看其是否存在并由相应的权限。
如果设置为INVOKER,则每次调用不会去审核definer对应的账户是否存在,只需要调用存储过程的用户有执行存储过程权限,访问存储过程里面包含对象的权限即可。
---------------------------------------------------------------------
显示特定数据库的存储过程(根据特定的名称查询存储过程)
SHOW PROCEDURE STATUS WHERE NAME LIKE '%d2%';
显示存储过程的源码
SHOW CREATE PROCEDURE d5;
删除存储过程
DROP PROCEDURE d5;
MYSQL 存储过程(一)
于 2024-06-20 14:04:29 首次发布