MYSQL 存储过程(一)

-- 定义一个存储过程
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;
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荒--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值