标签:salary 03 sal -- 游标 cursor emp 使用
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;
标签:salary,03,sal,--,游标,cursor,emp,使用 来源: https://www.cnblogs.com/shici/p/14406355.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。