zoukankan      html  css  js  c++  java
  • 游标

    -----------------------------游标 begin-----------------------------------------
    12. 使用游标
    要求: 打印出 80 部门的所有的员工的工资: salary: xxx
     

    declare
      --1. 定义游标
      cursor salary_cursor is select salary from employees where department_id = 80;
      v_salary employees.salary%type;
    begin
     --2. 打开游标
     open salary_cursor;
    
    
     --3. 提取游标
     fetch salary_cursor into v_salary;
     
     --4. 对游标进行循环操作: 判断游标中是否有下一条记录
    while salary_cursor%found loop
          dbms_output.put_line('salary: ' || v_salary);
          fetch salary_cursor into v_salary;
    end loop;  
     
     --5. 关闭游标
     close  salary_cursor;
    end;
    

      


    13. 使用游标的练习: 打印出 manager_id 为 100 的员工的 last_name, email, salary 信息(使用游标, 记录)

    declare  
               --声明游标    
               cursor emp_cursor is select last_name, email, salary from employees where manager_id = 100;
               
               --声明记录类型
               type emp_record is record(
                    name employees.last_name%type,
                    email employees.email%type,
                    salary employees.salary%type
               );
               
               -- 声明记录类型的变量
               v_emp_recorde emp_record;
    begin
               --打开游标
               open emp_cursor;
               
               --提取游标
               fetch emp_cursor into v_emp_recorde;
               
               --对游标进行循环操作
               while emp_cursor%found loop
                      dbms_output.put_line(v_emp_recorde.name || ', ' || v_emp_recorde.email || ', ' || v_emp_recorde.salary );                
                      fetch emp_cursor into v_emp_recorde;
               end loop;
               
               --关闭游标
               close emp_cursor;
    end;

    14. 利用游标, 调整公司中员工的工资: 
        
        工资范围       调整基数
        0 - 5000       5%
        5000 - 10000   3%
        10000 - 15000  2%
        15000 -        1%

    declare
        --定义游标
        cursor emp_sal_cursor is select salary, employee_id from employees;
        
        --定义基数变量
        temp number(4, 2);
        
        --定义存放游标值的变量
        v_sal employees.salary%type;
        v_id employees.employee_id%type;
    begin
        --打开游标
        open emp_sal_cursor;
        
        --提取游标
        fetch emp_sal_cursor into v_sal, v_id;
        
        --处理游标的循环操作
        while emp_sal_cursor%found loop
              --判断员工的工资, 执行 update 操作
              --dbms_output.put_line(v_id || ': ' || v_sal);
                
              if v_sal <= 5000 then
                 temp := 0.05;
              elsif v_sal<= 10000 then
                 temp := 0.03;   
              elsif v_sal <= 15000 then
                 temp := 0.02;
              else
                 temp := 0.01;
              end if;
              
              --dbms_output.put_line(v_id || ': ' || v_sal || ', ' || temp);
              update employees set salary = salary * (1 + temp) where employee_id = v_id; 
                      
              fetch emp_sal_cursor into v_sal, v_id;
        end loop;
        --关闭游标
        close emp_sal_cursor;
    end;

    使用 decode 函数

    update employees set salary = salary * (1 + (decode(trunc(salary/5000), 0, 0.05,
                                                                            1, 0.03,
                                                                            2, 0.02,
                                                                            0.01)))

    15. 利用游标 for 循环完成 14. (重要)

    declare
        --定义游标
        cursor emp_sal_cursor is select salary, employee_id id from employees;
        
        --定义基数变量
        temp number(4, 2);
    begin
        --处理游标的循环操作
        for c in emp_sal_cursor loop
              --判断员工的工资, 执行 update 操作
              --dbms_output.put_line(v_id || ': ' || v_sal);
                
              if c.salary <= 5000 then
                 temp := 0.05;
              elsif c.salary <= 10000 then
                 temp := 0.03;   
              elsif c.salary <= 15000 then
                 temp := 0.02;
              else
                 temp := 0.01;
              end if;
              
              --dbms_output.put_line(v_id || ': ' || v_sal || ', ' || temp);
              update employees set salary = salary * (1 + temp) where employee_id = c.id;
        end loop;
    end;

    16. 带参数的游标(重要)

    declare
        --定义游标
        cursor emp_sal_cursor(dept_id number, sal number) is 
               select salary + 1000 sal, employee_id id 
               from employees 
               where department_id = dept_id and salary > sal;
        
        --定义基数变量
        temp number(4, 2);
    begin
        --处理游标的循环操作
        for c in emp_sal_cursor(sal => 10000, dept_id => 80) loop
              --判断员工的工资, 执行 update 操作
              --dbms_output.put_line(v_id || ': ' || v_sal);
                
              if c.sal <= 5000 then
                 temp := 0.05;
              elsif c.sal <= 10000 then
                 temp := 0.03;   
              elsif c.sal <= 15000 then
                 temp := 0.02;
              else
                 temp := 0.01;
              end if;
              
              --dbms_output.put_line(c.sal || ': ' || c.id || ', ' || temp);
              update employees set salary = salary * (1 + temp) where employee_id = c.id;
        end loop;
    end;

    17. 隐式游标: 更新指定员工 salary(涨工资 10),如果该员工没有找到,则打印”查无此人” 信息

    begin
             update employees set salary = salary + 10 where employee_id = 1005;
             
             if sql%notfound then
                dbms_output.put_line('查无此人!');
             end if;
    end;

    -----------------------------游标 end-----------------------------------------

  • 相关阅读:
    【LeetCode】46. 全排列(回溯)
    [P2894][USACO08FEB] 酒店Hotel (线段树+懒标记下传)
    [P2680][NOIP2015T6] 运输计划 (LCA+树上差分+二分)
    静态主席树学习笔记
    [P1941][NOIP2014T3] 飞扬的小鸟 (0/1背包+完全背包)
    [P1084][NOIP2012T6] 疫情控制 (二分+贪心+LCA)
    [P3959][NOIP2017T5] 宝藏 (状压DP+DFS)
    [P2679][NOIP2015T5] 子串 (DP+滚动数组)
    [P1314][NOIP2011T5] 聪明的质检员 (二分+前缀和)
    [P1966][NOIP2013T2] 火柴排队 (求逆序对+归并排序/树状数组)
  • 原文地址:https://www.cnblogs.com/nbkyzms/p/5031432.html
Copyright © 2011-2022 走看看