`
chaoyi
  • 浏览: 306383 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle PL/SQL的练习题

 
阅读更多
--建立员工表employee  p97 员工编号empno 员工名称ename 工资sal 工作job  部门编号deptno

--建立部门表dept   注解 deptno 部门名称 name

--练习一

DECLARE
   v_tax_rate NUMBER(2);
   v_sal_d NUMBER(5);
   v_tax NUMBER(10,2);
   v_sal NUMBER(10,2);
   c_sal_start CONSTANT NUMBER(10):=3500;
BEGIN
   SELECT sal 
     INTO v_sal 
     FROM employee 
   WHERE ename='KING';
   v_tax:=0;
   IF v_sal>=3500 THEN
     v_sal:=v_sal-c_sal_start;
     CASE 
     WHEN v_sal<=1500 THEN
          v_tax_rate:=3;
          v_sal_d:=0;
     WHEN v_sal<=4500 THEN
          v_tax_rate:=10;
          v_sal_d:=105;   
     WHEN v_sal<=9000 THEN 
          v_tax_rate:=20;
          v_sal_d:=555;
     ELSE 
          v_tax_rate:=25;
          v_sal_d:=1005;
     END CASE;
     v_tax:=v_sal*v_tax_rate/100-v_sal_d;
   END IF;
   dbms_output.put_line(v_tax);
END;


DECLARE
   v_bonus NUMBER(10,2);
   v_hiredate employee.hiredate%TYPE;
BEGIN
   SELECT hiredate 
     INTO v_hiredate 
     FROM employee 
   WHERE ename='SCOTT';
   IF sysdate-v_hiredate>=365*6 THEN
       v_bonus:=2000;
   ELSE
       v_bonus:=1500;
   END IF;
   UPDATE employee SET comm=v_bonus
    WHERE ename='SCOTT'; 
END;


DECLARE
   v_grade  NUMBER(2);
   v_dname dept.dname%TYPE;
   v_sal employee.sal%TYPE;
BEGIN
   SELECT sal,dname 
     INTO v_sal,v_dname 
     FROM employee e INNER join dept d
       ON  e.deptno=d.deptno
    WHERE ename='SCOTT';
   CASE 
   WHEN v_sal<=3200 AND v_sal>=700 THEN
      v_grade:=1;
   WHEN v_sal<=4400 THEN
      v_grade:=2;
   WHEN v_sal<=5000 THEN 
      v_grade:=3;
   WHEN v_sal<=7000 THEN 
      v_grade:=4;
   WHEN v_sal<=9999 THEN 
      v_grade:=5;
   ELSE 
      v_grade:=0;
   END CASE;
   IF v_grade=0 THEN
      dbms_output.put_line('SCOTT所在部门:'||v_dname||' 薪水:'||v_sal||' 工资无级别');
   ELSE
      dbms_output.put_line('SCOTT所在部门:'||v_dname||' 薪水:'||v_sal||' 工资级别:'||v_grade);      
   END IF;
END;

--为员工SCOTT增加工资,每次增加100元,直到10000元停止。

DECLARE
   v_hight employee.sal%TYPE:=10000;
   v_sal employee.sal%TYPE;
BEGIN 
   SELECT sal 
     INTO v_sal 
     FROM employee 
    WHERE ename='SCOTT';
   LOOP
   EXIT WHEN v_sal+100>v_hight;   
      UPDATE employee
         SET sal=sal+100
       WHERE ename='SCOTT' ;
       v_sal:=v_sal+100;
   END LOOP;
END;

SELECT * FROM employee;


--练习二

--自己实现


--练习三

DECLARE
 	v_sal employee.sal%TYPE;
 	v_deptno employee.deptno%TYPE;
	e_comm_is_null EXCEPTION; --定义异常类型变量
BEGIN
	SELECT sal,deptno INTO v_sal,v_deptno 
    FROM employee 
   WHERE empno=7788;
   IF  v_deptno=20 THEN
      IF v_sal<10000 THEN
         UPDATE employee
         SET sal=10000
         WHERE empno=7788;
      ELSE
	       RAISE e_comm_is_null;
      END IF;
	 END IF;
EXCEPTION
   WHEN NO_DATA_FOUND THEN
       dbms_output.put_line('雇员不存在!错误为:'||SQLCODE||SQLERRM);
	 WHEN e_comm_is_null THEN
	   dbms_output.put_line('工资不低于10000元');
	 WHEN others THEN
	   dbms_output.put_line('出现其他异常');
END;

--练习四

DECLARE
   v_tax_rate NUMBER(2);
   v_sal_d NUMBER(5);
   v_tax NUMBER(10,2);
   v_sal NUMBER(10,2);
   v_sum NUMBER(10,2):=0;
   c_sal_start CONSTANT NUMBER(10):=3500;
   CURSOR emp_cursor IS
      SELECT sal 
        FROM employee;
BEGIN
  OPEN emp_cursor; 
  LOOP
     FETCH emp_cursor INTO v_sal; 
     EXIT WHEN emp_cursor%NOTFOUND;   
     v_tax:=0;
     IF v_sal>=3500 THEN
        v_sal:=v_sal-c_sal_start;
        CASE 
        WHEN v_sal<=1500 THEN
          v_tax_rate:=3;
          v_sal_d:=0;
        WHEN v_sal<=4500 THEN
          v_tax_rate:=10;
          v_sal_d:=105;   
        WHEN v_sal<=9000 THEN 
          v_tax_rate:=20;
          v_sal_d:=555;
        ELSE 
          v_tax_rate:=25;
          v_sal_d:=1005;
        END CASE;
        v_tax:=v_sal*v_tax_rate/100-v_sal_d;
      END IF;
      v_sum:=v_sal+v_tax;
   END LOOP;
   CLOSE emp_cursor;
   dbms_output.put_line(v_sum);
END;


DECLARE
   v_bonus NUMBER(10,2);
   CURSOR emp_cursor IS
      SELECT hiredate 
        FROM employee
        FOR UPDATE;
BEGIN
   FOR cur1 IN emp_cursor LOOP
      IF sysdate-cur1.hiredate>=365*6 THEN
         v_bonus:=2000;
      ELSE
         v_bonus:=1500;
      END IF;
      UPDATE employee SET comm=v_bonus
       WHERE CURRENT OF emp_cursor; 
   END LOOP;
END;


DECLARE
   v_grade  NUMBER(2);
   CURSOR emp_cursor IS
      SELECT ename,sal,dname 
        FROM employee e INNER join dept d
          ON  e.deptno=d.deptno
       WHERE dname='SALES';
BEGIN
   FOR cur1 IN emp_cursor LOOP    
      CASE 
      WHEN cur1.sal<=3200 AND cur1.sal>=700 THEN
         v_grade:=1;
      WHEN cur1.sal<=4400 THEN
         v_grade:=2;
      WHEN cur1.sal<=5000 THEN 
         v_grade:=3;
      WHEN cur1.sal<=7000 THEN 
         v_grade:=4;
      WHEN cur1.sal<=9999 THEN 
         v_grade:=5;
      ELSE 
         v_grade:=0;
      END CASE;
      IF v_grade=0 THEN
         dbms_output.put_line(cur1.ename||'所在部门:'||cur1.dname||' 薪水:'||cur1.sal||' 工资无级别');
      ELSE
         dbms_output.put_line(cur1.ename||'所在部门:'||cur1.dname||' 薪水:'||cur1.sal||' 工资级别:'||v_grade);      
      END IF;
   END LOOP;
END;

--练习五

CREATE OR REPLACE PROCEDURE fire_employee(
    eno employee.empno%type,                  --输入参数,雇员编号
    on_Flag OUT number,       --执行状态
    os_Msg OUT VARCHAR2       --提示信息
)
IS
   e1 EXCEPTION; --定义异常类型变量
BEGIN
   DELETE
     FROM employee
    WHERE empno=eno;
   IF SQL%NOTFOUND THEN
     RAISE e1;
   ELSE
      on_Flag:=1;
      os_Msg:='成功';
   END IF;
EXCEPTION
   WHEN e1 THEN
      on_Flag:=-1;
      os_Msg:='该雇员不存在。';
   WHEN OTHERS THEN
      on_Flag:=SQLCODE;
      os_Msg:=SQLERRM;
END; 

DECLARE
   v_no employee.empno%TYPE;
   on_Flag number(1);     --执行状态
   os_Msg VARCHAR2(200);       --提示信息  
BEGIN
   v_no:=7788;
   fire_employee(v_no,on_flag,os_Msg);
   dbms_output.put_line(on_flag);
   dbms_output.put_line(os_Msg);
END;


--调用get_sals存储过程,显示员工薪水


CREATE OR REPLACE PROCEDURE get_sals(
   cur_salary OUT SYS_REFCURSOR,
   on_Flag OUT number,       --执行状态
   os_Msg OUT VARCHAR2       --提示信息
) 
AS
BEGIN
   OPEN cur_salary FOR
       SELECT empno,sal FROM employee;
   on_Flag:=1;
   os_Msg:='成功';       
EXCEPTION
   WHEN OTHERS THEN
      on_Flag:=-1;
      os_Msg:='其他错误,与管理员联系。';
END;

DECLARE
   v_empno  employee.empno%type;
   v_sal employee.sal%type;
   emp_salary SYS_REFCURSOR;
   on_Flag number(1);     --执行状态
   os_Msg VARCHAR2(200);       --提示信息    
BEGIN
   get_sals(emp_salary,on_Flag,os_Msg);
   IF on_flag=1 THEN
      LOOP
         FETCH emp_salary INTO v_empno, v_sal;
         EXIT WHEN emp_salary%notfound;
         DBMS_OUTPUT.PUT_LINE(v_empno||'的薪水是' ||v_sal);
      END LOOP;
   ELSE
      dbms_output.put_line(os_Msg);
   END IF;
   IF emp_salary%ISOPEN THEN
      CLOSE emp_salary;
   END IF;
END;

 

分享到:
评论

相关推荐

    oracle PL/SQL测试题目和详细答案

    ### Oracle PL/SQL测试题目与知识点解析 #### 一、选择题知识点解析 **1. Oracle数据库中为新创建的表分配的初始空间通常为多大?** - **知识点解析:** Oracle数据库为新创建的表分配的空间单位是“区”(Extent...

    oracle pl sql 实例精解 源代码

    首先,我们来看End_of_Chapter_Exercises.zip,这可能包含了每个章节结束时的练习题或项目。这些练习通常设计得具有实际意义,旨在巩固每章学习的知识点,包括变量声明、条件语句(如IF-THEN-ELSIF)、循环(如FOR、...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一) http://download.csdn.net/source/3268267 Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二) ...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

     本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法...

    Oracle PL/SQL程序设计(第5版)源代码

    Oracle PL/SQL程序设计是数据库开发领域中一本权威的...同时,解决书中的练习题也是提升技能的好方法。记住,实践是掌握任何编程语言的关键,因此,动手实验这些代码,并根据需要进行修改,是学习PL/SQL的最好方式。

    Oracle PL/SQL实例精讲--使用表,课后答案

    2. **End_of_Chapter_Exercises.zip**:这个文件可能包含每章结束时的练习题和解答。这些练习旨在帮助读者巩固所学的知识,通过解决实际问题来提高他们的编程技能。解答部分对于自我评估和学习进度的跟踪至关重要。 ...

    oracle PL/SQL英文课件

    课件可能包含详细的讲解、示例代码、练习题和解答,旨在提供一个全面的学习环境,帮助学员熟练掌握Oracle PL/SQL编程。无论你是数据库管理员、开发人员还是系统分析师,这个课件都将为你的职业生涯添加重要的技能。

    Oracle存储过程LP/SQL练习题(含答案)

    Oracle存储过程LP/SQL练习题(含答案) 几个练习题

    精通pl/sql

    《精通PL/SQL》这本书是针对Oracle数据库系统中PL/SQL编程语言的深度解析与实践指南,主要面向希望提升在Oracle环境下使用PL/SQL技能的专业人士。PL/SQL,全称为Procedural Language/Structured Query Language,是...

    Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

    Oracle 数据库实用教程第三章 PL/SQL 程序设计 本章节主要介绍了 PL/SQL 程序设计的基础知识,包括 PL/SQL 的优点、运行 PL/SQL 程序、PL/SQL 块结构、PL/SQL 基本语法、PL/SQL 处理流程、异常处理、游标、存储过程...

    Introduction To ORACLE9i PL/SQL(所有讲解及习题)

    Oracle9i PL/SQL是Oracle数据库系统中的一种过程化编程语言,它结合了SQL的查询功能和传统的编程语言特性,使得数据库操作更为高效和灵活。本资料“Introduction To ORACLE9i PL/SQL”提供了全英文的学习资源,适合...

    pl/sql 练习题.

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一个编程环境,主要用于管理和操作Oracle数据库。它是SQL的扩展,增加了程序设计语言的特性,使得开发者能够编写复杂的存储过程、...

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    PL/SQL是Oracle数据库中的一个核心组件,全称为Procedural Language/Structured Query Language,即过程化结构化查询语言。它是SQL的扩展,允许开发者在SQL的基础上添加过程化编程元素,如循环、条件判断和子程序等...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

    本书是专门为Oracle应用开发人员提供的SQL和PL/SQL编程指南。通过学习本书,读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的作用及使用方法,...

    精通oracle10g PL/SQL编程

    Oracle数据库是目前世界上使用最广泛的数据库之一,而PL/SQL是Oracle公司提供的过程化SQL语言,它是对SQL标准的扩展,使得数据库开发人员可以编写出更为复杂的程序代码。在Oracle10g版本中,PL/SQL语言得到了进一步...

    Oracle SQL PL/SQL 练习资料

    在本练习资料中,你可能会遇到各种SQL和PL/SQL的练习题,涵盖了从基础到高级的各种场景。比如: 1. 数据查询:练习如何使用SELECT语句进行简单的查询和复杂的联接操作。 2. 数据操作:通过INSERT、UPDATE和DELETE...

    oracle 大学PL/SQL 编程培训资料

    这些资料会提供实例演示、练习题和解决方案,帮助开发者逐步建立起实际操作的能力,从而在数据库开发领域中提升专业技能。对于那些希望在Oracle数据库环境中进行高效编程的人来说,这是一个不可多得的学习资源。

    oracle 10g WDP-PL/SQL 官方培训 PPT

    Oracle 10g WDP-PL/SQL 官方培训PPT是一套全面且深入的教程,旨在帮助学习者掌握Oracle数据库系统中的编程语言PL/SQL。PL/SQL(Procedural Language/Structured Query Language)是Oracle专为数据库管理设计的一种...

Global site tag (gtag.js) - Google Analytics