mysql存储过程

本文详细介绍了如何在MySQL中创建和使用存储过程,包括设置输入输出参数、流程控制语句(如IFELSE、CASE、WHILE、REPEATUNTIL、LOOP)以及在Mybatis中的调用方式。此外,还展示了如何进行存储过程的CRUD操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、基本语法

DELIMITER $$

CREATE
    /*
    in代表输入参数(默认情况下为in参数),表示该参数的值必须由调用程序指定。
    ou代表输出参数,表示该参数的值经存储过程计算后,将out参数的计算结果返回给调用程序。
    */
    PROCEDURE 数据库名.存储过程名([in变量名 类型,out 参数 2,...])
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
	BEGIN
		[DECLARE 变量名 类型 [DEFAULT 值];]
		存储过程的语句块;
	END$$

DELIMITER ;

2、创建存储过程

DELIMITER $$

CREATE
    PROCEDURE  `xc`()
	-- 存储过程体
	BEGIN
		-- DECLARE声明 用来声明变量的
		DECLARE de_name VARCHAR(10) DEFAULT '';
		
		SET de_name = "星晨创建存储过程~";
		
		-- 测试输出语句(不同的数据库,测试语句都不太一样。
		SELECT de_name;
	END$$
	
-- 	查询存储过程
	CALL xc();

 

3、有参数的存储过程

DELIMITER $$
-- 查询user表中的sex为男性有多少个人
CREATE
    PROCEDURE `xc2`(IN s_sex CHAR(1),OUT s_count INT)
	-- 存储过程体
	BEGIN
		-- 把SQL中查询的结果通过INTO赋给变量
		SELECT COUNT(*) INTO s_count FROM user WHERE sex= s_sex;
		SELECT s_count;
		
	END$$
DELIMITER ;


-- @s_count表示测试出输出的参数
CALL xc2 ('男',@s_count);

4、流程控制语句 IF ELSE

DELIMITER $$
CREATE
    PROCEDURE  `xc3`(IN `day` INT)
	-- 存储过程体
	BEGIN
		IF `day` = 0 THEN
		SELECT '星期天';
		ELSEIF `day` = 1 THEN
		SELECT '星期一';
		ELSEIF `day` = 2 THEN
		SELECT '星期二';
		ELSE
		SELECT '其它日期';
		END IF;
		
	END$$
DELIMITER ;


CALL xc3(1);

5、条件控制语句 CASE

DELIMITER $$
CREATE 
    PROCEDURE xc4(IN num INT)
	BEGIN
		CASE -- 条件开始
	
		WHEN num<0 THEN 
			SELECT '负数';
		WHEN num>0 THEN 
			SELECT '正数';
		ELSE 
		SELECT '不是正数也不是负数';
	
		END CASE; -- 条件结束
	END$$
DELIMITER;

CALL xc4(1);

DELIMITER $$
CREATE 
    PROCEDURE xc5(IN num INT)
	BEGIN
		CASE num  -- 条件开始
		WHEN 1 THEN 
			SELECT '输入为1';
		WHEN 0 THEN 
			SELECT '输入为0';
		ELSE 
		SELECT '不是1也不是0';
		END CASE; -- 条件结束
	END$$
DELIMITER;


CALL xc5(0);

6、循环语句 WHILE

DELIMITER $$
CREATE 
    PROCEDURE xc6(IN num INT,OUT SUM INT)
	BEGIN
	     SET SUM = 0;
	     WHILE num<10 DO -- 循环开始
	         SET num = num+1;
	         SET SUM = SUM+num;
	         END WHILE; -- 循环结束
	END$$
DELIMITER;

-- 调用函数
CALL xc6(0,@sum);

-- 查询函数
SELECT @sum;

7、循环语句 REPEAT UNTLL

-- 创建过程
DELIMITER $$
CREATE 
    PROCEDURE xc7(IN num INT,OUT SUM INT)
	BEGIN
	     SET SUM = 0;
	     REPEAT-- 循环开始
		SET num = num+1;
		SET SUM = SUM+num ;
		UNTIL num>=10
		END REPEAT; -- 循环结束
	END$$
DELIMITER;

CALL xc7(9,@sum);

SELECT @sum;

8、循环语句 LOOP

DELIMITER $$
CREATE 
    PROCEDURE xc8(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 demo8(0,@sum);

SELECT @sum;

9、存储过程插入信息

DELIMITER $$
CREATE 
    PROCEDURE xc9(IN s_student VARCHAR(10),IN s_sex CHAR(1),OUT s_result VARCHAR(20))
	BEGIN
	   -- 声明一个变量 用来决定这个名字是否已经存在
	   DECLARE s_count INT DEFAULT 0;
	   -- 验证这么名字是否已经存在
	   SELECT COUNT(*) INTO s_count FROM userWHERE `name` = s_student;	
	   IF s_count = 0 THEN
	        INSERT INTO user(`name`, sex) VALUES(s_student, s_sex);
		SET s_result = '数据添加成功';
	   ELSE
                SET s_result = '名字已存在,不能添加';
                SELECT s_result;
	   END IF;
	END$$
DELIMITER;


CALL xc9("xc","男",@s_result);

10、存储过程CRUD

-- 查询
SHOW PROCEDURE STATUS
SHOW PROCEDURE STATUS WHERE db = 'db名字' AND NAME = 'name名字';
-- 显示存储过程的源码
SHOW CREATE PROCEDURE 存储过程名;

-- 删除
DROP PROCEDURE 存储过程名;

11、Mybatis中

<parameterMap type="savemap" id=“usermap"> 
	<parameter property="name" jdbcType="VARCHAR" mode="IN"/>
	<parameter property="sex" jdbcType="CHAR" mode="IN"/>
	<parameter property="result" jdbcType="VARCHAR" mode="OUT"/>
</parameterMap>

<insert id="saveUserDemo" parameterMap="savemap" statementType="CALLABLE"> 
{call saveuser(?, ?, ?)} 
</insert >

Java代码调用

HashMap<String, Object> map = new HashMap<>(); 
	map.put("name", "星晨"); 
	map.put("sex","男");
	userDao.saveUserDemo(map); 
	map.get(“result”);//获得输出参数


 

出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.youkuaiyun.com/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值