1 ************************************** 2 游标的使用 3 ************************************** 4 --12.1 使用游标 5 6 --要求: 打印出 80 部门的所有的员工的工资:salary: xxx 7 8 declare 9 --1. 定义游标 10 cursor salary_cursor is select salary from employees where department_id = 80; 11 v_salary employees.salary%type; 12 begin 13 --2. 打开游标 14 open salary_cursor; 15 16 --3. 提取游标 17 fetch salary_cursor into v_salary; 18 19 --4. 对游标进行循环操作: 判断游标中是否有下一条记录 20 while salary_cursor%found loop 21 dbms_output.put_line('salary: ' || v_salary); 22 fetch salary_cursor into v_salary; 23 end loop; 24 25 --5. 关闭游标 26 close salary_cursor; 27 end; 28 29 --12.2 使用游标 30 31 --要求: 打印出 80 部门的所有的员工的工资: Xxx 's salary is: xxx 32 33 declare 34 cursor sal_cursor is select salary ,last_name from employees where department_id = 80; 35 v_sal number(10); 36 v_name varchar2(20); 37 begin 38 open sal_cursor; 39 40 fetch sal_cursor into v_sal,v_name; 41 42 while sal_cursor%found loop 43 dbms_output.put_line(v_name||'`s salary is '||v_sal); 44 fetch sal_cursor into v_sal,v_name; 45 end loop; 46 47 close sal_cursor; 48 49 end; 50 51 --13. 使用游标的练习: 52 --打印出 manager_id 为 100 的员工的 last_name, email, salary 信息(使用游标, 记录类型) 53 54 declare 55 --声明游标 56 cursor emp_cursor is select last_name, email, salary from employees where manager_id = 100; 57 58 --声明记录类型 59 type emp_record is record( 60 name employees.last_name%type, 61 email employees.email%type, 62 salary employees.salary%type 63 ); 64 65 -- 声明记录类型的变量 66 v_emp_record emp_record; 67 begin 68 --打开游标 69 open emp_cursor; 70 71 --提取游标 72 fetch emp_cursor into v_emp_record; 73 74 --对游标进行循环操作 75 while emp_cursor%found loop 76 dbms_output.put_line(v_emp_record.name || ', ' || v_emp_record.email || ', ' || v_emp_record.salary ); 77 fetch emp_cursor into v_emp_record; 78 end loop; 79 80 --关闭游标 81 close emp_cursor; 82 end; 83 (法二:使用for循环) 84 declare 85 86 cursor emp_cursor is 87 select last_name,email,salary 88 from employees 89 where manager_id = 100; 90 91 begin 92 93 94 for v_emp_record in emp_cursor loop 95 dbms_output.put_line(v_emp_record.last_name||','||v_emp_record.email||','||v_emp_record.salary); 96 end loop; 97 end; 98 99 --14. 利用游标, 调整公司中员工的工资: 100 101 工资范围 调整基数 102 0 - 5000 5% 103 5000 - 10000 3% 104 10000 - 15000 2% 105 15000 - 1% 106 107 declare 108 --定义游标 109 cursor emp_sal_cursor is select salary, employee_id from employees; 110 111 --定义基数变量 112 temp number(4, 2); 113 114 --定义存放游标值的变量 115 v_sal employees.salary%type; 116 v_id employees.employee_id%type; 117 begin 118 --打开游标 119 open emp_sal_cursor; 120 121 --提取游标 122 fetch emp_sal_cursor into v_sal, v_id; 123 124 --处理游标的循环操作 125 while emp_sal_cursor%found loop 126 --判断员工的工资, 执行 update 操作 127 --dbms_output.put_line(v_id || ': ' || v_sal); 128 129 if v_sal <= 5000 then 130 temp := 0.05; 131 elsif v_sal<= 10000 then 132 temp := 0.03; 133 elsif v_sal <= 15000 then 134 temp := 0.02; 135 else 136 temp := 0.01; 137 end if; 138 139 --dbms_output.put_line(v_id || ': ' || v_sal || ', ' || temp); 140 update employees set salary = salary * (1 + temp) where employee_id = v_id; 141 142 fetch emp_sal_cursor into v_sal, v_id; 143 end loop; 144 --关闭游标 145 close emp_sal_cursor; 146 end; 147 148 使用SQL中的 decode 函数 149 150 update employees set salary = salary * (1 + (decode(trunc(salary/5000), 0, 0.05, 151 1, 0.03, 152 2, 0.02, 153 0.01))) 154 155 --15. 利用游标 for 循环完成 14. 156 157 declare 158 --定义游标 159 cursor emp_sal_cursor is select salary, employee_id id from employees; 160 161 --定义基数变量 162 temp number(4, 2); 163 begin 164 --处理游标的循环操作 165 for c in emp_sal_cursor loop 166 --判断员工的工资, 执行 update 操作 167 --dbms_output.put_line(v_id || ': ' || v_sal); 168 169 if c.salary <= 5000 then 170 temp := 0.05; 171 elsif c.salary <= 10000 then 172 temp := 0.03; 173 elsif c.salary <= 15000 then 174 temp := 0.02; 175 else 176 temp := 0.01; 177 end if; 178 179 --dbms_output.put_line(v_id || ': ' || v_sal || ', ' || temp); 180 update employees set salary = salary * (1 + temp) where employee_id = c.id; 181 end loop; 182 end; 183 184 --16*. 带参数的游标 185 186 declare 187 --定义游标 188 cursor emp_sal_cursor(dept_id number, sal number) is 189 select salary + 1000 sal, employee_id id 190 from employees 191 where department_id = dept_id and salary > sal; 192 193 --定义基数变量 194 temp number(4, 2); 195 begin 196 --处理游标的循环操作 197 for c in emp_sal_cursor(sal => 4000, dept_id => 80) loop 198 --判断员工的工资, 执行 update 操作 199 --dbms_output.put_line(c.id || ': ' || c.sal); 200 201 if c.sal <= 5000 then 202 temp := 0.05; 203 elsif c.sal <= 10000 then 204 temp := 0.03; 205 elsif c.sal <= 15000 then 206 temp := 0.02; 207 else 208 temp := 0.01; 209 end if; 210 211 dbms_output.put_line(c.sal || ': ' || c.id || ', ' || temp); 212 --update employees set salary = salary * (1 + temp) where employee_id = c.id; 213 end loop; 214 end; 215 216 --17. 隐式游标: 更新指定员工 salary(涨工资 10),如果该员工没有找到,则打印”查无此人” 信息 217 218 begin 219 update employees set salary = salary + 10 where employee_id = 1005; 220 221 if sql%notfound then 222 dbms_output.put_line('查无此人!'); 223 end if; 224 end;