From 927fb003b2494af6fd703da5bc78e0a531767c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8F=AD=E9=98=B3=E4=B8=BD?= <2431466589@qq.com> Date: Thu, 12 Oct 2023 00:10:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=B8=E6=A0=87=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\350\256\260+\347\273\203\344\271\240.md" | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 "37 \346\217\255\351\230\263\344\270\275/20231011 \346\270\270\346\240\207\347\254\224\350\256\260+\347\273\203\344\271\240.md" diff --git "a/37 \346\217\255\351\230\263\344\270\275/20231011 \346\270\270\346\240\207\347\254\224\350\256\260+\347\273\203\344\271\240.md" "b/37 \346\217\255\351\230\263\344\270\275/20231011 \346\270\270\346\240\207\347\254\224\350\256\260+\347\273\203\344\271\240.md" new file mode 100644 index 0000000..a2a64f6 --- /dev/null +++ "b/37 \346\217\255\351\230\263\344\270\275/20231011 \346\270\270\346\240\207\347\254\224\350\256\260+\347\273\203\344\271\240.md" @@ -0,0 +1,170 @@ +## 笔记 + +### 游标 + +游标分为四步: + +1. 声明游标 + + ```sql + declare 游标名称 cursor for sql语句; + -- 定义变量来接收游标的值,变量的定义要放在游标定义之前 + 例: + declare cursor_name cursor for select_statement; + ``` + + + +2. 打开游标 + + ```sql + open 游标名称; + 例: + open cursor_name; + ``` + + + +3. 使用游标 + + ``` sql + fetch 游标名称 into 变量1,变量...; + -- 变量的类型,位置和数量要由定义游标时的select得到的列的数列位置和类型决定 + -- 每次fetch,游标就从结果集下移一行,一次一行 + 例: + fetch cursor_name into var_name; + ``` + + + +4. 关闭游标 + + ```sql + close 游标名称; + 例: + close cursor_name; + ``` + +declare handler_action(程序处理方式) handler for condition_value(条件值)... + + ### 存储函数 + +```sql +delimiter // +create function f_abc(参数名称 数据类型,...) +returns 结果的数据类型 +begin + return -- 要返回的结果,(一般是select语句,只有一行一列的结果)但也可以是其它明确的某个值 +end // +delimiter ; +-- 如果return出现sql语句,一定要写contains sql +-- deterministic contains sql (确认有sql语句) +``` + + ## 课堂练习 + +```sql +CREATE DATABASE uu charset utf8; +use uu; +-- 部门表 + create table dept( + deptno int primary key auto_increment, -- 部门编号 + dname varchar(14) , -- 部门名字 + loc varchar(13) -- 地址 + ) ; + -- 员工表 + create table emp( + empno int primary key auto_increment,-- 员工编号 + ename varchar(10), -- 员工姓名 - + job varchar(9), -- 岗位 + mgr int, -- 直接领导编号 + hiredate date, -- 雇佣日期,入职日期 + sal int, -- 薪水 + comm int, -- 提成 + deptno int not null, -- 部门编号 + foreign key (deptno) references dept(deptno) + ); + insert into dept values(10,'财务部','北京'); + insert into dept values(20,'研发部','上海'); + insert into dept values(30,'销售部','广州'); + insert into dept values(40,'行政部','深圳'); + insert into emp values(7369,'刘一','职员',7902,'1980-12-17',800,null,20); + insert into emp values(7499,'陈二','推销员',7698,'1981-02-20',1600,300,30); + insert into emp values(7521,'张三','推销员',7698,'1981-02-22',1250,500,30); + insert into emp values(7566,'李四','经理',7839,'1981-04-02',2975,null,20); + insert into emp values(7654,'王五','推销员',7698,'1981-09-28',1250,1400,30); + insert into emp values(7698,'赵六','经理',7839,'1981-05-01',2850,null,30); + insert into emp values(7782,'孙七','经理',7839,'1981-06-09',2450,null,10); + insert into emp values(7788,'周八','分析师',7566,'1987-06-13',3000,null,20); + insert into emp values(7839,'吴九','总裁',null,'1981-11-17',5000,null,10); + insert into emp values(7844,'郑十','推销员',7698,'1981-09-08',1500,0,30); + insert into emp values(7876,'郭十一','职员',7788,'1987-06-13',1100,null,20); + insert into emp values(7900,'钱多多','职员',7698,'1981-12-03',950,null,30); + insert into emp values(7902,'大锦鲤','分析师',7566,'1981-12-03',3000,null,20); + insert into emp values(7934,'木有钱','职员',7782,'1983-01-23',1300,null,10); + + +-- 1.利用游标,查询并计算出emp表中全公司的总薪资(salary和comm) +drop procedure p1; +delimiter// +CREATE procedure p1(out num int) +BEGIN +declare usalary int; +declare ucomm int; +declare usum int default 0; +declare i int default 1; +declare ub cursor for select sal,ifnull(comm,0) from emp; +declare continue handler for 1329 set i = 5; +open ub; +while i=1 DO + fetch ub into usalary,ucomm; + set usum = usalary+ucomm+usum; + end while; + close ub; + set num = usum; + +END// +delimiter; + +call p1(@ab); +select @ab; + + +-- 2.利用游标修改表格,如果sal<1000,则删除工资为此值的员工,如果1000 < sal <= 3000,该员工薪资涨100,否则扣工资100,将该员工信息复制到一个新表, + +drop procedure p2; +delimiter// +CREATE procedure p2() +BEGIN +declare uname VARCHAR(50); -- 定义名字的变量 +declare a_sal int; -- 定义薪资的变量 +declare cou int; -- 定义统计的变量 +declare i int default 1; -- 设置i的默认值 +declare ub cursor for select sal,ename from emp; -- 声明游标,后面要加sql语句 + +drop table if exists a1; -- 如果表a1存在,那就删除 +CREATE table a1( -- 创建新表 + id int PRIMARY KEY auto_increment, + uname varchar(50), + a_sal int +); +select COUNT(*) into cou from emp; -- 统计记录多少条 +open ub; + while i