--建立员工表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测试题目与知识点解析 #### 一、选择题知识点解析 **1. Oracle数据库中为新创建的表分配的初始空间通常为多大?** - **知识点解析:** Oracle数据库为新创建的表分配的空间单位是“区”(Extent...
首先,我们来看End_of_Chapter_Exercises.zip,这可能包含了每个章节结束时的练习题或项目。这些练习通常设计得具有实际意义,旨在巩固每章学习的知识点,包括变量声明、条件语句(如IF-THEN-ELSIF)、循环(如FOR、...
Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一) http://download.csdn.net/source/3268267 Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二) ...
本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法...
Oracle PL/SQL程序设计是数据库开发领域中一本权威的...同时,解决书中的练习题也是提升技能的好方法。记住,实践是掌握任何编程语言的关键,因此,动手实验这些代码,并根据需要进行修改,是学习PL/SQL的最好方式。
2. **End_of_Chapter_Exercises.zip**:这个文件可能包含每章结束时的练习题和解答。这些练习旨在帮助读者巩固所学的知识,通过解决实际问题来提高他们的编程技能。解答部分对于自我评估和学习进度的跟踪至关重要。 ...
课件可能包含详细的讲解、示例代码、练习题和解答,旨在提供一个全面的学习环境,帮助学员熟练掌握Oracle PL/SQL编程。无论你是数据库管理员、开发人员还是系统分析师,这个课件都将为你的职业生涯添加重要的技能。
Oracle存储过程LP/SQL练习题(含答案) 几个练习题
《精通PL/SQL》这本书是针对Oracle数据库系统中PL/SQL编程语言的深度解析与实践指南,主要面向希望提升在Oracle环境下使用PL/SQL技能的专业人士。PL/SQL,全称为Procedural Language/Structured Query Language,是...
Oracle 数据库实用教程第三章 PL/SQL 程序设计 本章节主要介绍了 PL/SQL 程序设计的基础知识,包括 PL/SQL 的优点、运行 PL/SQL 程序、PL/SQL 块结构、PL/SQL 基本语法、PL/SQL 处理流程、异常处理、游标、存储过程...
Oracle9i PL/SQL是Oracle数据库系统中的一种过程化编程语言,它结合了SQL的查询功能和传统的编程语言特性,使得数据库操作更为高效和灵活。本资料“Introduction To ORACLE9i PL/SQL”提供了全英文的学习资源,适合...
PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一个编程环境,主要用于管理和操作Oracle数据库。它是SQL的扩展,增加了程序设计语言的特性,使得开发者能够编写复杂的存储过程、...
PL/SQL是Oracle数据库中的一个核心组件,全称为Procedural Language/Structured Query Language,即过程化结构化查询语言。它是SQL的扩展,允许开发者在SQL的基础上添加过程化编程元素,如循环、条件判断和子程序等...
本书是专门为Oracle应用开发人员提供的SQL和PL/SQL编程指南。通过学习本书,读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的作用及使用方法,...
Oracle数据库是目前世界上使用最广泛的数据库之一,而PL/SQL是Oracle公司提供的过程化SQL语言,它是对SQL标准的扩展,使得数据库开发人员可以编写出更为复杂的程序代码。在Oracle10g版本中,PL/SQL语言得到了进一步...
在本练习资料中,你可能会遇到各种SQL和PL/SQL的练习题,涵盖了从基础到高级的各种场景。比如: 1. 数据查询:练习如何使用SELECT语句进行简单的查询和复杂的联接操作。 2. 数据操作:通过INSERT、UPDATE和DELETE...
这些资料会提供实例演示、练习题和解决方案,帮助开发者逐步建立起实际操作的能力,从而在数据库开发领域中提升专业技能。对于那些希望在Oracle数据库环境中进行高效编程的人来说,这是一个不可多得的学习资源。
Oracle 10g WDP-PL/SQL 官方培训PPT是一套全面且深入的教程,旨在帮助学习者掌握Oracle数据库系统中的编程语言PL/SQL。PL/SQL(Procedural Language/Structured Query Language)是Oracle专为数据库管理设计的一种...