59、mysql存储过程

存储过程

一、存储过程:

1.1、存储过程的概念

概念:完成特定功能的sql语句的集合。把定义好的sql集合在一个特定的sql的函数当中

每次执行调用函数即可。还可以实现传参的调用。

1.2、存储过程的语法:

delimiter $$
##delimiter开始和结束的语法,$$标志位,可以自定义,不要用数字开头,不要用汉字不能使用特殊字符开头。
create procedure test1()
BEGIN
 SELECT * FROM info1;
end $$
delimiter;

show procedure status where db='test1';

SHOW procedure status LIKE 'test1';#查看存储过程的名称

call test1;#执行begin里面语句

#更新begin里面的语句,需要重新创建新的存储过程
create procedure test2()
BEGIN
 SELECT * FROM info1;
 UPDATE info1 SET high=200 where id = 1;
end $$
delimiter;
call test2;

1.2.1、存储过程传参

in 传入参数,调用者向存储过程传入值

delimiter $$
##delimiter开始和结束的语法,$$标志位,可以自定义,不要用数字开头,不要用汉字不能使用特殊字符开头。
create procedure test6(in uname char(10))
BEGIN
 SELECT * FROM info1 where name = uname;
end $$
delimiter;
call test6('fg');

1.2.2、out 输出参数 存储过程向调用者传出值 传出单个值

delimiter $$
create procedure test7(out num INT)
BEGIN
 set num=100;
end $$
delimiter;
call test7(@num);
select @num;
CREATE table info1 (id int(4));
insert into info2 value(@num);

1.2.3、out 输出参数 存储过程向调用者传出值 传出多个值

delimiter $$
create procedure test8 (out id int,out name char(3),out high int,out address char(20))
BEGIN
set id=5;
set name='王心凌';
set high=185;
set address='幸云教育';
end $$
delimiter;

call test8(@id,@name,@high,@address)
select @id,@name,@high,@address;

insert into info1 value(@id,@name,@high,@address);

1.2.4、inout 输入输出,既可以表示存储过程向调用者传出,也可以表示用户向存储过程传入值

delimiter $$
create procedure test10 (inout str varchar(20))
BEGIN
select str;
#在存储过程中引用变量无须加@
set str=CONCAT(str,'str_test1');
#替换,把字符串进行替换。
select str;
end $$
delimiter;

set @str='蔡';
CALL test9(@str);


delimiter $$
create procedure test10 (inout str varchar(20))
BEGIN
select str;
#在存储过程中引用变量无须加@
set str=CONCAT(str,'str_test1');
#替换,把字符串进行替换。
select str;
end $$
delimiter;

set @str='蔡';
CALL test9(@str);

UPDATE info1 set name=@str where id = 2 ;


delimiter $$
create procedure test11 (inout str varchar(20))
BEGIN
select str;
#在存储过程中引用变量无须加@
set str=CONCAT(str);
#替换,把字符串进行替换。
select str;
end $$
delimiter;

set @str='蔡';
CALL test11(@str);

UPDATE info1 set name=@str where id = 2 ;
UPDATE info1 set name=@str where id = 1 ;

1.2.5、inout 输入输出,既可以表示存储过程向调用者传出,也可以表示用户向存储过程传入值

delimiter $$
create procedure test1 (INOUT ht varchar(20))
BEGIN
set ht=ht+10;
end $$
delimiter;
set @ht=185;
call test1(@ht);
UPDATE info1 set high=@ht where id =2 ;

1.2.6、存储过程中的控制语句

delimiter $$
create procedure test12 (inout num INT)
BEGIN
if num >=10 THEN
set num=num-5;
ELSE
set num=num*2;
end IF;
END $$
delimiter;


set @num=19
CALL test12(@num);

UPDATE info1 set id=@num where high = 200 ;
范围:
delimiter $$
create procedure test14 (INOUT SCORE INT,OUT grade varchar(255))
BEGIN
if score between 85 and 100 THEN
set grade='优秀';
ELSEIF score between 60 and 84 then 
set grade='及格';
ELSE
set grade='不及格';
end if;
END $$
delimiter;

set @score=70;
call test14(@score,@grade)
CREATE table info3(
id INT,
score int,
grade char(20)
);
insert into info3 value(6,@score,@grade);

1.2.7、存储过程的循环语句

delimiter $$
create procedure test2 (OUT result INT)
BEGIN
DECLARE a INT;
declare i int;
set a=10;
set i=1;
while i<=10 DO
set a=a+10;
SET i=i+1;
end WHILE;
set result = a;
END $$
delimiter;

set @result=110;
call test2(@result);
select @result;


delimiter $$
create procedure test4 (inout result INT)
BEGIN
declare a int; 
declare i int;
set a=result;
set i=1;
while i<=10
DO
set a=a+10;
set i=i+1;
end while;
set result = a;
end $$
delimiter;

set @result=110;
call test4(@result);
select @result;



1.3、存储过程的作用

执行速度比sql语句执行速度更快,执行效率也更高。

客户端可以随时调用发放,也可以随后修改。

可以对数据库做任何操作。

二、课后作业

题目需求根据订单号,求出订单总和

#订单表
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    total_amount DECIMAL(10, 2)
);
#订单货表
CREATE TABLE order_items (
    order_item_id INT PRIMARY KEY,
    order_id INT,
    product_id INT,
    quantity INT,
    price DECIMAL(10, 2)
);
INSERT INTO orders (order_id, customer_id, order_date, total_amount) 
VALUES(1, 101, '2024-07-20', 0.00),
(2, 102, '2024-07-21', 0.00);
INSERT INTO order_items 
(order_item_id, order_id, product_id, quantity, price) 
VALUES(1, 1, 1001, 2, 50.00),
(2, 1, 1002, 1, 30.00),
(3, 2, 1001, 1, 50.00),
(4, 2, 1003, 3, 20.00);

delimiter $$
CREATE procedure test1() 
BEGIN 
UPDATE orders a SET a.total_amount = (  
##更新订单表的总额,利用order_id相同,别名,给oeders表里的total_amount赋值
SELECT SUM(quantity * price)  
FROM order_items b 
##对订单数量和价格进行求和 ,以便下一步赋值,下面的通过订单号相同order_id条件进行筛选
WHERE b.order_id = a.order_id 
##更新订单表的总额,利用order_id相同,别名,给oeders表里的total_amount赋值 
) ;
END $$
delimiter;

call test1();
SELECT * from orders;

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值