• Oracle存储过程及函数的练习题


    --存储过程、函数练习题

    --(1)创建一个存储过程,以员工号为参数,输出该员工的工资
    create or replace procedure p_sxt1(v_empno in emp.empno%type, v_sal out emp.sal%type) is
    begin
    select sal into v_sal from emp where empno = v_empno;
    end;
    --(1)执行
    declare
    v_empno emp.empno%type := 7369;
    v_sal emp.sal%type;
    begin
    p_sxt1(v_empno,v_sal);
    dbms_output.put_line(v_empno || ' 员工的工资为:' || v_sal);
    end;


    --(2)创建一个存储过程,以员工号为参数,修改该员工的工资。若该员工属于10号部门,
    --则工资增加150;若属于20号部门,则工资增加200;若属于30号部门,则工资增加250;
    --若属于其他部门,则增加300。
    create or replace procedure p_sxt2(v_empno in emp.empno%type) is
    v_deptno emp.deptno%type;
    v_sal emp.sal%type;
    begin
    select deptno into v_deptno from emp where empno = v_empno;
    select sal into v_sal from emp where empno = v_empno;
    dbms_output.put_line(v_empno || ' 的部门是 ' || v_deptno || ' 修改前的工资是 ' || v_sal);

    case v_deptno
    when 10 then
    update emp set sal = sal + 150 where empno = v_empno;
    when 20 then
    update emp set sal = sal + 200 where empno = v_empno;
    when 30 then
    update emp set sal = sal + 250 where empno = v_empno;
    else
    update emp set sal = sal + 300 where empno = v_empno;
    end case;

    select sal into v_sal from emp where empno = v_empno;
    dbms_output.put_line(v_empno || ' 的部门是 ' || v_deptno || ' 修改后的工资是 ' || v_sal);
    commit;
    end;
    --(2)执行
    begin
    p_sxt2(7369);
    end;


    --(3)创建一个存储过程,以员工号为参数,返回该员工的工作年限(以参数形式返回)。
    create or replace procedure p_sxt3(v_empno in emp.empno%type, v_year out number) is
    begin
    select round((sysdate - hiredate)/365,1) into v_year from emp where empno = v_empno;
    end;
    --(3)执行
    declare
    v_empno emp.empno%type := 7369;
    v_year number;
    begin
    p_sxt3(v_empno,v_year);
    dbms_output.put_line(v_empno || ' 工作年限为 ' || v_year || '年');
    end;


    --(4)创建一个存储过程,以部门号为参数,输出入职日期最早的10个员工信息。
    create or replace procedure p_sxt4(v_deptno emp.deptno%type) is
    cursor c_emp is select * from emp where deptno = v_deptno order by hiredate;
    v_times number := 0;
    begin
    for v_emp in c_emp loop
    v_times := v_times + 1;
    dbms_output.put_line(v_emp.empno || '**' || v_emp.ename || '**' || to_char(v_emp.hiredate,'yyyy-mm-dd'));
    if v_times = 10 then
    exit;
    end if;
    end loop;
    end;
    --(4)执行
    begin
    p_sxt4(20);
    end;


    --(5)创建一个函数,以员工号为参数,返回该员工的工资。
    create or replace function f_sxt5(v_empno emp.empno%type) return emp.sal%type is
    vr_sal emp.sal%type;
    begin
    select sal into vr_sal from emp where empno = v_empno;
    return vr_sal;
    end;
    --(5)执行
    select f_sxt5(7369)||'元' 工资 from dual;


    --(6)创建一个函数,以部门号为参数,返回该部门的平均工资。
    create or replace function f_sxt6(v_deptno emp.deptno%type) return emp.sal%type is
    vr_sal emp.sal%type;
    begin
    select avg(sal) into vr_sal from emp where deptno = v_deptno;
    return vr_sal;
    end;
    --(6)执行
    select f_sxt6(20) 部门平均工资 from dual;


    --(7)创建一个函数,以员工号为参数,返回该员工所在的部门的平均工资。
    create or replace function f_sxt7(v_empno emp.empno%type) return emp.sal%type is
    vr_sal emp.sal%type;
    begin
    select avg(sal) into vr_sal from emp where deptno = (select deptno from emp where empno = v_empno);
    return vr_sal;
    end;
    --(7)执行
    select f_sxt7(7369) from dual;


    --(8)创建一个存储过程,以员工号和部门号作为参数,修改员工所在的部门为所输入的部门号。
    --如果修改成功,则显示“员工由……号部门调入调入……号部门”;如果不存在该员工,则显示
    --“员工号不存在,请输入正确的员工号。”;如果不存在该部门,则显示
    --“该部门不存在,请输入正确的部门号。”。
    create or replace procedure p_sxt14(v_empno in emp.empno%type, v_deptno in emp.deptno%type) is
    vt_empno number := 0;
    vt_deptno number := 0;
    vm_deptno emp.deptno%type;
    begin
    select count(*) into vt_empno from emp where empno = v_empno;
    select deptno into vm_deptno from emp where empno = v_empno;
    select count(distinct deptno) into vt_deptno from emp where deptno = v_deptno;

    if vt_empno = 0 then
    dbms_output.put_line('员工号不存在,请输入正确的员工号。');
    end if;
    if vt_deptno = 0 then
    dbms_output.put_line('该部门不存在,请输入正确的部门号。');
    end if;

    if vt_empno = 1 and vt_deptno = 1 then
    dbms_output.put_line('员工由 ' || vm_deptno || ' 号部门调入调入 ' || v_deptno || ' 号部门');
    update emp set deptno = v_deptno where empno = v_empno;
    commit;
    end if;
    end;
    --(8)执行
    begin
    p_sxt14(7369,30);
    end;


    --(9)创建一个存储过程,以一个整数为参数,输入工资最高的前几个(参数值)员工的信息。
    create or replace procedure p_sxt15(v_number in number) is
    cursor c_emp is select * from emp order by sal desc;
    v_n number := 0;
    begin
    for v_emp in c_emp loop
    v_n := v_n + 1;
    dbms_output.put_line(v_n || ' - ' || v_emp.ename || ' - ' || v_emp.sal);
    if v_n = v_number then
    exit;
    end if;
    end loop;
    end;
    --(9)执行
    begin
    p_sxt15(5);
    end;


    --(10)创建一个存储过程,以两个整数为参数,输出工资排序在两个参数之间的员工信息。
    create or replace procedure p_sxt16(v_up in number,v_down in number) is
    cursor c_emp is select * from emp order by sal desc;
    v_n number := 0;
    begin
    for v_emp in c_emp loop
    v_n := v_n + 1;
    if v_n >= v_up and v_n <= v_down then
    dbms_output.put_line(v_n || ' - ' || v_emp.ename || ' - ' || v_emp.sal);
    end if;
    end loop;
    end;
    --(10)执行
    begin
    p_sxt16(2,3);
    end;

  • 相关阅读:
    0-完全开源的 Vue.js 入门级教程:HelloVue,发车啦!
    [Java 开源项目]一款无需写任何代码,即可一键生成前后端代码的工具
    用 Java 做个“你画手机猜”的小游戏
    PowerJob 从 0 到 1.9k star 的经历
    最后一篇:结束不想说再见,那就扬帆再次起航!
    shell 常用快捷键
    微服务网关评测对比
    Docker加入自定义iptables规则链
    CentOS.7防火墙firewalld属性
    bash和shell的差别
  • 原文地址:https://www.cnblogs.com/studynode/p/10081072.html
Copyright © 2020-2023  润新知