设为首页 收藏本站
查看: 705|回复: 0

[经验分享] Oracle PL/SQL的练习题

[复制链接]

尚未签到

发表于 2016-8-12 07:14:29 | 显示全部楼层 |阅读模式
--建立员工表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;

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256661-1-1.html 上篇帖子: Oracle PL/SQL的大量操作 下篇帖子: Oracle 流程控制 和 循环控制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表