-- 存储过程 -- 1.存储过程,其实就是带逻辑的(多个)sql语句。 -- 也就是sql编程。 -- 2.存储过程的特点。 -- 1)存储过程保存到数据库服务器端,通过数据库客户端工具调用存储。 -- 2)存储过程的效率会非常高,因为存储过程是在服务器端执行的。 -- 3)缺点:存储过程的移植性是非常差的。 -- 如果数据库迁移,如果从mysql到Oracle的时候存储过程的语法差异是很大的。 就完全不能用了 -- 每种数据库客户端工具的存储过程的语法差异是很大的。 -- 存储过程在Stored Procs中 -- 查看全局变量 SHOW VARIABLES; SHOW VARIABLES LIKE 'c%'; -- 但是关于全局变量:我们只能修改来设置 -- 不能添加全局变量,全局变量一共有300多个,都是有意义的 -- 只能添加和修改会话变量和局部变量 -- 1.0 使用现有的oracleDemo来测试我的存储过程 -- mysql中创建存储过程 -- 先要定义一个结束的符号 -- 符号是任意定义的 -- 一般是$ DELIMITER $ -- delimiter:分隔符(delimiter $ 定义$为分割符) CREATE PROCEDURE test() -- 可以不写参数 BEGIN SELECT * FROM emp; END $ -- 在end的地方使用此分隔符进行结束说明 -- 调用存储过程 CALL test(); -- delimiter 结束符号 -- create procedure 存储过程名称(参数, 参数... ) -- begin -- 多个sql语句 -- end 结束符号 -- 调用存储过程 -- call 存储过程名称(实际参数列表) -- 参数类型 -- in 输入参数,可以携带数据到存储过程中 -- out 输出参数,可以携带数据到存储过程外面 -- inout 输入输出参数 -- 1.1 输入参数:查询指定id 的对应的员工 DELIMITER $ CREATE PROCEDURE pro_testByIn(IN id INT) BEGIN SELECT * FROM emp WHERE emp.`EMPNO` = id; END $ -- 没有大小写的区别 CALL pro_testByIN(7566); -- 调用:如何来接受存储过程的输出参数 -- 定义一个变量去接收输出参数。 -- mysql数据库中的三种变量: -- 1)全局变量:mysql内置的变量,mysql程序关闭时,全局变量才会消失 -- show variables; 可以查看全部变量 -- show variables like 'character%'; 模糊匹配前面带有character的 -- character_set_client:mysql接收的客户端的数据编码 -- character_set_results:mysql输出给客户端的数据编码 -- 查看某个全局变量:select @@变量名 -- select @@character_set_client; -- 修改全局变量:set @@变量名=值 -- set @@character_set_client=gbk; -- 2)会话变量。变量只在某次登录的会话中有效! -- 退出连接,会话变量数据失效! -- 查看某个会话变量:select @变量名 -- 不同的客户端登录的,会话变量不能访问 -- 修改/定义 会话变量:set @变量名=值 -- set @name = 'eric'; -- 如果该会话变量不存在的话,修改就相当于创建 -- 3)局部变量:在存储过程中定义的变量 -- 存储过程结束,局部变量失效。 -- 查看某个会话变量:select 变量名 -- 修改局部变量:set 变量名=值 -- set name = 'eric'; -- 定义某个局部变量: -- declare 变量名 数据类型; -- 1.3 带有输出参数的存储过程 DELIMITER $ CREATE PROCEDURE pro_testByOut(OUT n VARCHAR(20)) BEGIN SET n='输出参数'; END $ -- 带出输出参数,一般使用会话变量 -- 如果需要初始化参数的话 可以先set @n = '100' -- 但是如果不需要的话,可以直接这样传,就可以使用了 CALL pro_testByOut(@n); SELECT @n; -- 1.4 带有输入输出参数的存储过程 DELIMITER $ CREATE PROCEDURE pro_testByInOut(INOUT n VARCHAR(20)) BEGIN -- n被传入之后,就是此存储过程中的局部变量了 -- 查看变量 SELECT n; -- 修改n变量 SET n = '500'; END $ SET @n = '100'; CALL pro_testByInOut(@n); SELECT @n; -- 1.5 带有判断条件的存储过程 -- 传入一个num整数,num=1 输出周一,num=2 输出周二,num=3 输出周三,否则不输出! SET @num=1 DELIMITER $ CREATE PROCEDURE test_if(IN num INT, OUT str VARCHAR(20)) BEGIN IF num=1 THEN SET str='周一:day01'; -- 因为我们这个数据库在创建的时候忘记设置utf8,所以用英文 ELSEIF num=2 THEN SET str='周二:day02'; ELSEIF num=3 THEN SET str='周三:day03'; ELSE SET str='错误参数:error'; END IF; END $ CALL test_if(@num, @str); SELECT @str; -- 1.6 带有循环条件的存储过程 -- 需求:输入一个num,计算从1到num的总和。 DELIMITER $ CREATE PROCEDURE pro_testByWhile(IN num INT, OUT score INT) BEGIN -- 会话变量的修改和定义都是set -- 局部变量的修改是set定义是DECLARE DECLARE i INT DEFAULT 1; DECLARE result INT DEFAULT 0; WHILE i<=num DO SET result = result + i; SET i = i + 1; END WHILE; SET score = result; END $ -- set @num = 100; -- call pro_testByWhile(@num, @score); -- select @score; -- 形参和实参也遵循高级语言规则,可以不同 CALL pro_testByWhile(100, @score01); SELECT @score01; -- 1.7 携带数据库的数据给输出参数 -- 需求:传入员工id,查询对应的员工,输出员工姓名 DELIMITER $ CREATE PROCEDURE pro_testData(IN id INT, OUT ename VARCHAR(20)) BEGIN -- 注意:这里不能直接写ename into ename -- 虽然不会报错,但是mysql识别不出来, -- 这样有歧义的话,不管id是多少查出来都是null SELECT emp.ename INTO ename FROM emp WHERE emp.`EMPNO` = id; END $ CALL pro_testData(7369, @ename); SELECT @ename; -- 1.8 进行一个对员工工资进行筛选的存储过程 DELIMITER $ CREATE PROCEDURE get_salGrade(IN sal DOUBLE(7, 2), OUT result VARCHAR(20)) BEGIN IF sal BETWEEN 800 AND 1000 THEN SET result = '很少'; ELSEIF sal BETWEEN 1001 AND 2000 THEN SET result = '还好'; ELSEIF sal BETWEEN 2001 AND 4000 THEN SET result = '不错'; ELSE SET result ='XXX'; END IF; END $ CALL get_salGrade(2000, @res); SELECT @res; DROP PROCEDURE get_salGrade; -- drop的话,直接写名字就可以
mysql存储过程学习
猜你喜欢
转载自blog.csdn.net/qq_36791569/article/details/80166910
今日推荐
周排行