diff --git "a/58 \351\231\210\350\203\234\346\235\260/2023-10-11.md" "b/58 \351\231\210\350\203\234\346\235\260/2023-10-11.md" new file mode 100644 index 0000000000000000000000000000000000000000..627ac32ff45a6a56123a234509ca9835fd2bcbcb --- /dev/null +++ "b/58 \351\231\210\350\203\234\346\235\260/2023-10-11.md" @@ -0,0 +1,124 @@ +## 笔记 + +函数是有返回值的 + +跟存储过程一样都要有定界符 + +函数返回值只能返回一个 + +###### 语法 + +``` +delimiter // +create function 函数名() # function 没有其他参数类型只有一个in 但是不要写in +returns (结束的数据类型) +deterministic +#如果是sql 语句就需要写 +contains sql +# 如果不是sql语句则是 +contains nosql +begin + return (要返回的结果) # 一般是sql语句 只有一行一列的结果 但也可以是精确的摸一个值 +end // +delimiter ; +#查看存储函数 +select 函数名; +``` + +##### 游标 + +每次只处理一行,逐行处理 + +游标需要在begin + +``` +1. 声明游标 +declare 游标名 cursor for sql语句 +2. 打开游标 +open 游标名 +3. 使用游标 +fetch 游标名 into 变量1,变量....N +4. 关闭游标 +close 游标名 +``` + + + +## 作业 + +~~~ mysql +-- 1.利用游标,查询并计算出emp表中全公司的总薪资(salary和comm) +drop procedure h7; +delimiter // +create procedure h7(out num int) +begin + declare salary int; + declare commition int; + declare i int default 1; + declare my_count int; + declare a int default 0; + + declare u cursor for select sal,ifnull(comm,0) from emp; + declare continue handler for 1329 set i=2; + select count(*) into my_count from emp; + open u; + while i<=my_count do + fetch u into salary,commition; + set a = a+salary+commition; + set i = i + 1; + set num = a; + end while; + close u; +end // +delimiter ; +call h7(@name); +select @name; +-- 2.利用游标修改表格,如果sal<1000,则删除工资为此值的员工,如果1000 < sal <= 3000,该员工薪资涨100,将修改过的员工信息添加进一个新表中,否则扣工资100 +select * from emp; +drop procedure h8; +delimiter // +create procedure h8() +begin + declare e_empno int; + declare e_ename varchar(20); + declare e_job varchar(10); + declare e_mgr int; + declare e_hiredate date; + declare e_sal int; + declare e_comm int; + declare e_deptno int; + declare i int default 0; + declare ub cursor for select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp; + + declare continue handler for 1329 set i=2; + open ub; + drop table if exists emp_salary; + create table emp_salary( + e_empno int primary key auto_increment,-- 员工编号 + e_ename varchar(10), -- 员工姓名 - + e_job varchar(9), -- 岗位 + e_mgr int, -- 直接领导编号 + e_hiredate date, -- 雇佣日期,入职日期 + e_sal int, -- 薪水 + e_comm int, -- 提成 + e_deptno int not null, -- 部门编号 + foreign key (e_deptno) references dept(deptno) + ); + while i=1 do + fetch ub into e_empno,e_ename,e_job,e_mgr,e_hiredate,e_sal,e_comm,e_deptno; + if e_sal<1000 then + select '已删除'; + elseif e_sal <= 3000 then + update emp set sal=sal+100; + insert into emp_salary values(e_empno,e_ename,e_job,e_mgr,e_hiredate,e_sal,e_comm,e_deptno); + else + update emp set sal=sal-100; + insert into emp_salary values(e_empno,e_ename,e_job,e_mgr,e_hiredate,e_sal,e_comm,e_deptno); + end if; + end while; + close ub; +end // +delimiter ; +call h8(); +select * from emp_salary; +~~~ \ No newline at end of file