【第22期】观点:IT 行业加班,到底有没有价值?

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

原创 2013年12月05日 17:06:54
--存储过程、函数练习题

--(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;


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

sql 存储过程 入门级 练习

sql 存储过程 入门级

存储过程练习

存储过程练习 --创建存储过程 create proc Pro_GetNews(存储过程的名字) ----调用存储过程 exec Pro_GetNews --包含输入参数的存储过程 CRE...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

SQL存储过程实例详解

本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能。

oracle创建一个带参数的存储过程:为指定的员工,涨100块钱的工资;并且打印涨前和涨后的薪水

--创建一个带参数的存储过程 --为指定的员工,涨100块钱的工资;并且打印涨前和涨后的薪水 /* begin raisesalary(6755); raisesalary(...

存储过程&函数返回结果集

--创建测试表 create table t01(id integer,name varchar2(10)); --创建测试数据 insert into t01(id,name) values (1...
  • orcldb
  • orcldb
  • 2013-01-24 14:02
  • 7830

面试概率极大的Oracle存储过程

面试经常被问到的存储过程,似懂非懂,觉得写的不错,先 收藏了! 1、什么是存储过程。存储过程是数据库服务器端的一段程序,它有两种类型。一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据...

Oracle笔试题

1、下列不属于ORACLE的逻辑结构的是() A、区 B、段 C、数据文件 D、表空间 答案:C 2、下面哪个用户不是ORACLE缺省安装后就存在的用户( ) A、SYSDBA B、SYSTEM C、...

简单oracle存储过程测试

存储过程 create or replace procedure lcd(lid in number,lname out varchar2) as lock_handler varchar2(128)...

oracle 面试题

一 ORACLE和MySQL的区别 1.  是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高Oracl...

oracle常见面试题

一、基础概念 1. 列举几种表连接方式 Answer:等连接(内连接)、非等连接、自连接、外连接(左、右、全) Or hash join/merge join/nest loop(cluster...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)