PL/SQL经典练习

/*
=========================================================PL/SQL编程
=========================================================
*/--先把scott里面的表弄到test表空间里面来
CREATE TABLE EMP ASSELECT * FROM SCOTT.EMP;
CREATE TABLE DEPT ASSELECT * FROM SCOTT.DEPT;       
/*
上机1
*/
--(1)计算King所交税金DECLARE V_SHUIJIN NUMBER;          --应交税金V_SAL SCOTT.EMP.SAL%TYPE;  --工资C_QIZHENDIAN CONSTANT NUMBER :=3500;
BEGINSELECT SAL INTO V_SAL FROM SCOTT.EMP WHERE ENAME='KING';IF (V_SAL-C_QIZHENDIAN)<=1500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.03-0;ELSIF (V_SAL-C_QIZHENDIAN)>1500 AND (V_SAL-C_QIZHENDIAN)<=4500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.1-105;ELSIF (V_SAL-C_QIZHENDIAN)>4500 AND (V_SAL-C_QIZHENDIAN)<=9000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.2-555;ELSIF (V_SAL-C_QIZHENDIAN)>9000 AND (V_SAL-C_QIZHENDIAN)<=35000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.25-1005;ELSIF (V_SAL-C_QIZHENDIAN)>35000 AND (V_SAL-C_QIZHENDIAN)<=55000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.3-2755;ELSIF (V_SAL-C_QIZHENDIAN)>55000 AND (V_SAL-C_QIZHENDIAN)<=80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.35-5505;ELSIF (V_SAL-C_QIZHENDIAN)>80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.45-13505;END IF;DBMS_OUTPUT.PUT_LINE('KING所交的税金是:'||V_SHUIJIN);
END;--(2)根据员工scott入职的时间修改发放奖金列,大于等于6年的奖金为2000,小于6年的奖金是1500
DECLARE V_SCOTT_HIREDATE EMP.HIREDATE%TYPE;    --SCOTT的入职时间V_COMM NUMBER;                         --奖金                          
BEGINSELECT HIREDATE INTO V_SCOTT_HIREDATE FROM EMP WHERE ENAME='SCOTT';IF (SYSDATE-V_SCOTT_HIREDATE)>=365*6 THENV_COMM:=2000;ELSEV_COMM:=1500;END IF;--开始修改UPDATE EMP SET COMM=V_COMM WHERE ENAME='SCOTT';IF  SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('修改成功!');ELSEDBMS_OUTPUT.PUT_LINE('修改失败!');END IF;
END;--(3)查询scott相应的工资级别并显示所在部门名称,薪水,和所在的级别
DECLARE V_SCOTT_SAL EMP.SAL%TYPE;   --scott的工资V_JIBIE NUMBER;             --级别V_DEPTNAME  DEPT.DNAME%TYPE;    --部门名称  
BEGINSELECT SAL,DNAME INTO V_SCOTT_SAL,V_DEPTNAME FROM EMP E JOIN DEPT DON E.DEPTNO=D.DEPTNOWHERE ENAME='SCOTT';IF V_SCOTT_SAL>700 AND V_SCOTT_SAL<=3200 THENV_JIBIE:=1;    --第一级别ELSIF V_SCOTT_SAL>3200 AND V_SCOTT_SAL<=4400 THENV_JIBIE:=2;    --第二级别ELSIF V_SCOTT_SAL>4400 AND V_SCOTT_SAL<=5000 THENV_JIBIE:=3;    --第三级别ELSIF V_SCOTT_SAL>5000 AND V_SCOTT_SAL<=7000 THENV_JIBIE:=4;    --第四级别ELSIF V_SCOTT_SAL>7000 AND V_SCOTT_SAL<=10000 THENV_JIBIE:=5;    --第五级别END IF;DBMS_OUTPUT.PUT_LINE('SCOTT所在的部门是:'||V_DEPTNAME||',薪水是:'||V_SCOTT_SAL||',所在的级别是:第'||V_JIBIE||'级别');
END;  
--(4)位员工scott增加工资,每次增加100,直到增加到10000为止
DECLARE V_SCOTT_SAL EMP.SAL%TYPE;   --SCOTT的工资
BEGINSELECT SAL INTO V_SCOTT_SAL FROM EMP WHERE ENAME='SCOTT';LOOP--增加工资V_SCOTT_SAL:=V_SCOTT_SAL+100;EXIT WHEN V_SCOTT_SAL>=10000;END LOOP;   --修改scott的工资UPDATE EMP SET SAL=V_SCOTT_SAL WHERE ENAME='SCOTT';IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('增加成功!');ELSEDBMS_OUTPUT.PUT_LINE('增加失败!');END IF;
END; /*
上机2  预定义异常
公司通过emp表维护职员记录,用以接收职员编号并检索职员姓名,
*/     
DECLARE V_ENAME VARCHAR2(4);
BEGINSELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO=&EMPNO;DBMS_OUTPUT.PUT_LINE('已找到'||V_ENAME);
EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('对不起,没有该职员!');WHEN VALUE_ERROR THENDBMS_OUTPUT.PUT_LINE('职员名称太长!');WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('出现其他的异常!');
END;/*
上机3自定义异常、
||输入员工编号,工资,部门编号,
||如果部门代码是10,且工资低于10000,更新员工的工资是10000
||如果部门代码是10,工资高于10000,显示消息“工资不低于10000”
||如果部门代码不是10则不显示
*/
DECLARE V_EMPNO EMP.EMPNO%TYPE;        --员工编号V_DEPTNO EMP.DEPTNO%TYPE;      --部门编号V_SAL EMP.SAL%TYPE;            --工资V_ENAME EMP.ENAME%TYPE;        --姓名    V_V_EMPNO EMP.EMPNO%TYPE;      --输入员工编号V_V_DEPTNO EMP.DEPTNO%TYPE;    --输入部门编号V_V_SAL EMP.SAL%TYPE;          --输入工资E_ERROR_DEPTNO EXCEPTION;      --自定义异常(部门编号不是10)E_ERROR_EMPNO EXCEPTION;       --自定义异常(找不到该员工)V_COUNT NUMBER;                --声明一个记录数
BEGIN--输入员工编号V_EMPNO:=&V_V_EMPNO;--输入工资V_SAL:=&V_VSAL;--输入部门编号V_DEPTNO:=&V_V_DEPTNO;IF V_DEPTNO=10 THEN--在进行二次判断(输入员工编号)IF V_SAL<10000 THEN--判断输入的员工编号是否存在,不存在的话报异常,存在的话继续SELECT COUNT(*) INTO V_COUNT FROM EMP WHERE EMPNO=V_DEPTNO;IF V_COUNT!=1 THENRAISE E_ERROR_EMPNO;   --报异常ELSE--更新工资为1000UPDATE EMP SET SAL=10000 WHERE EMPNO=V_EMPNO;IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('更新成功!!!');ELSEDBMS_OUTPUT.PUT_LINE('更新失败!!!');END IF;END IF;           ELSIF V_SAL>10000 THENDBMS_OUTPUT.PUT_LINE('工资不低于10000!!');END IF;ELSERAISE E_ERROR_DEPTNO;END IF;
EXCEPTION WHEN E_ERROR_DEPTNO THENDBMS_OUTPUT.PUT_LINE('部门代码不是10!!');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出现其他异常,请自行解决!!!');
END;
------------------------------------------------------SELECT * FROM EMP;
DECLARE V_NAME EMP.ENAME%TYPE;E_ERROR EXCEPTION;V_COUNT NUMBER;   --记录数
BEGINSELECT COUNT(*) INTO V_COUNT  FROM EMP WHERE EMPNO=7901;IF (V_COUNT=1) THENDBMS_OUTPUT.PUT_LINE(V_NAME);ELSERAISE E_ERROR;END IF;EXCEPTION WHEN E_ERROR THENDBMS_OUTPUT.PUT_LINE('没有记录!');/*when no_data_found thenDBMS_OUTPUT.PUT_LINE('找不到!');*/END;
-------------------------------------------------------------
DECLARE V_NAME VARCHAR2(10);E_ERROR EXCEPTION;
BEGINIF V_NAME IS NULL THENRAISE E_ERROR;ELSE DBMS_OUTPUT.PUT_LINE(V_NAME);END IF;EXCEPTION WHEN E_ERROR THENDBMS_OUTPUT.PUT_LINE('没有记录!');END;/*
//上机4使用游标
*/--(1)计算公司应交税金的总额
DECLARE V_SHUIJIN NUMBER;          --应交税金V_SAL SCOTT.EMP.SAL%TYPE;  --工资V_SUM NUMBER(10):=0;          --总税金C_QIZHENDIAN CONSTANT NUMBER :=3500;CURSOR CURSOR_SAL ISSELECT SAL FROM EMP;    --所有的员工的工资
BEGINOPEN CURSOR_SAL; LOOPFETCH CURSOR_SAL INTO V_SAL;--把所有的工资放在V_SAL里面EXIT WHEN CURSOR_SAL%NOTFOUND;IF (V_SAL-C_QIZHENDIAN)<=1500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.03-0;ELSIF (V_SAL-C_QIZHENDIAN)>1500 AND (V_SAL-C_QIZHENDIAN)<=4500 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.1-105;ELSIF (V_SAL-C_QIZHENDIAN)>4500 AND (V_SAL-C_QIZHENDIAN)<=9000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.2-555;ELSIF (V_SAL-C_QIZHENDIAN)>9000 AND (V_SAL-C_QIZHENDIAN)<=35000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.25-1005;ELSIF (V_SAL-C_QIZHENDIAN)>35000 AND (V_SAL-C_QIZHENDIAN)<=55000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.3-2755;ELSIF (V_SAL-C_QIZHENDIAN)>55000 AND (V_SAL-C_QIZHENDIAN)<=80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.35-5505;ELSIF (V_SAL-C_QIZHENDIAN)>80000 THENV_SHUIJIN:=(V_SAL-C_QIZHENDIAN)*0.45-13505;END IF;V_SUM:=V_SUM+V_SHUIJIN;END LOOP;  CLOSE CURSOR_SAL;   --关闭游标DBMS_OUTPUT.PUT_LINE(V_SUM);
EXCEPTION WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出现异常!');
END; 
--(2)根据员工入职时间修改所有员工发放奖金,大于6年的+2000,小于的1500+
DECLARE V_COMM EMP.COMM%TYPE;          --奖金CURSOR CURSOR_EMP_COMM IS SELECT HIREDATE FROM EMP FOR UPDATE;BEGINFOR CUR1 IN CURSOR_EMP_COMM LOOPIF (SYSDATE-CUR1.HIREDATE)>=365*6 THENV_COMM:=2000;ELSEV_COMM:=1500;END IF;  --开始修改UPDATE EMP SET COMM=V_COMM WHERE CURRENT OF CURSOR_EMP_COMM;IF SQL%ROWCOUNT>0 THENDBMS_OUTPUT.PUT_LINE('更新成功!!!');ELSEDBMS_OUTPUT.PUT_LINE('更新失败!!!');END IF;END LOOP;
EXCEPTION WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出现异常!');
END;
--(3)显示员工姓名,所在部门名称,薪水,所在级别
DECLARE C_DNAME CONSTANT VARCHAR2(20):='SALES';       --销售部门V_JIBIE NUMBER;                   --级别CURSOR CURSOR_EMP IS SELECT ENAME,DNAME,SAL FROM EMP EJOIN DEPT D ON E.DEPTNO=D.DEPTNOWHERE DNAME=C_DNAME;                      
BEGINFOR C1 IN CURSOR_EMP LOOPIF C1.SAL>700 AND C1.SAL<=3200 THENV_JIBIE:=1;    --第一级别ELSIF C1.SAL>3200 AND C1.SAL<=4400 THENV_JIBIE:=2;    --第二级别ELSIF C1.SAL>4400 AND C1.SAL<=5000 THENV_JIBIE:=3;    --第三级别ELSIF C1.SAL>5000 AND C1.SAL<=7000 THENV_JIBIE:=4;    --第四级别ELSIF C1.SAL>7000 AND C1.SAL<=10000 THENV_JIBIE:=5;    --第五级别ELSEV_JIBIE:=0;    --没有级别END IF;DBMS_OUTPUT.put_line(C1.ENAME||'在'||C1.DNAME||'部门,'||'薪水是'||C1.SAL||'在第'||V_JIBIE||'级别');END LOOP;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('出现异常!');
END;/*
上机5 存储过程
*/
--(1)根据输入的员工编号,删除相应的员工
CREATE  OR REPLACE PROCEDURE DEL_EMPNAME
(ENO EMP.EMPNO%TYPE,        --输入员工的编号ON_FLAG OUT NUMBER,    --执行状态,-1失败,1成功 0异常ON_MSG OUT VARCHAR    --提示信息)
IS E_ERROR EXCEPTION; --异常信息
BEGINDELETE FROM EMP WHERE EMPNO=ENO;IF SQL%NOTFOUND THENRAISE E_ERROR;ELSEON_FLAG:=1;      --执行成功ON_MSG:='删除成功!';END IF;
EXCEPTION WHEN E_ERROR THENON_FLAG:=0;      --执行成功ON_MSG:='删除失败!';WHEN OTHERS THENON_FLAG:=0;ON_MSG:='出现异常!';
END;
DROP PROCEDURE DEL_EMPNAME;
--调用存储过程
DECLARE V_EMPNO NUMBER;ENO NUMBER(5);ON_FLAG NUMBER(1);ON_MSG VARCHAR(20);
BEGINENO:=&EMPNO;   --输入编号DEL_EMPNAME(ENO,ON_FLAG,ON_MSG);DBMS_OUTPUT.PUT_LINE(ON_FLAG);DBMS_OUTPUT.PUT_LINE(ON_MSG);
END;--(2)创建输出参数为薪水集合的存储过程,调用并显示所有员工的薪水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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

alertmanager 告警恢复_Prometheus配置企业微信告警

kubernetes operator安装的&#xff0c;如果不会可看上一篇文章前提&#xff1a;创建企业微信&#xff0c;创建应用然后配置altermanager.yamlglobal:resolve_timeout: 5m receivers: - name: wechatwechat_configs:- agent_id: "100000x"api_secret: Nm7PRrxxxxG8Ep…

IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API。 使用IdentityServer4 来实现使用客户端凭据保护ASP.NET Core Web API 访问。 IdentityServer4 GitHub: https://github.com/IdentityServer/IdentityServer4 IdentityServer 框架支持以下功能&…

JAVA多线程总结(笔记)

线程的特点 线程就是独立的执行路径&#xff1b;在线程运行时&#xff0c;即使没有自己创建线程&#xff0c;后台也会有多个线程&#xff0c;如主线程&#xff0c;gc线程&#xff1b;main()称之为主线程&#xff0c;为系统的入口&#xff0c;用于执行整个程序&#xff1b;在一…

很有道理的内容

男生选女朋友最看重的是什么? 病毒营销陈轩 被赞同30万&#xff0c;被收藏24万&#xff0c;顶级病毒营销专家&#xff0c;加个人微信送书 12,540 人也赞同了该回答 有女孩给我发私信&#xff1a; “我是个很好的女孩&#xff0c;漂亮身材好&#xff0c;白领一枚&#xff0c…

学python后做什么工作好_学习完Python课程后可以做什么工作?

Python作为人工智能、大数据的首选编程语言&#xff0c;也是进入编程世界的理想选择&#xff0c;已经成为了大家都在追求学习的语言&#xff0c;那么学习Python之后到底可以做什么呢?为您详细的介绍一下。什么是Python?Python是一种面向对象解释型计算机程序设计语言。而且Py…

vue-beauty 的v-data-table数据单元不换行

原因由于css样式 .ant-table-tbody>tr>td, .ant-table-thead>tr>th {padding: 16px 8px;word-break: keep-all;white-space: nowrap; /*强制不换行*/ } 只需覆盖white-space的值就可以 如&#xff1a; .ant-table-tbody>tr>td {white-space:normal } 补…

用Middleware给ASP.NET Core Web API添加自己的授权验证

Web API&#xff0c;是一个能让前后端分离、解放前后端生产力的好东西。不过大部分公司应该都没能做到完全的前后端分离。API的实现方式有很 多&#xff0c;可以用ASP.NET Core、也可以用ASP.NET Web API、ASP.NET MVC、NancyFx等。说到Web API&#xff0c;不同的人有不同的做法…

公司电脑重装经验 ThinkPad E480 win7重装 电脑重装

***************************下面是20200813更新的****************************** 1.电脑的机械盘老是掉线 要重启才能找到 不用了 还是用自己的移动硬盘代替公司的D盘吧 拷贝也很慢 2.公司的c盘菜120G太小 就只安装必须使用的软件 外接移动硬盘代替电脑的D盘 可以用…

Java 内存泄露以及避免方法

转载自 Java 内存泄露以及避免方法 内存泄露: 是指在程序运行过程中会不断的分配内存空间&#xff0c;那些不再使用的内存空间应该即时回收它们&#xff0c;从而保证可以保证系统可以再次使用这些内存。如果存在无用的内存没有被收回来&#xff0c;那就是内存泄露。 说明…

Tomacat乱码解决

解决方法 解决后

体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景

说到队列的话&#xff0c;大家一定不会陌生&#xff0c;但是扯到优先级队列的话&#xff0c;还是有一部分同学是不清楚的&#xff0c;可能是不知道怎么去实现吧&#xff0c;其实呢&#xff0c;&#xff0c;&#xff0c;这东西已经烂大街了。。。很简单&#xff0c;用“堆”去实…

jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

转载自 jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令 1&#xff0e;Jstack 1.1 jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况。如下图所示 注&#xff1a;这个和thread dump是同样的结果。但是thread dump是用ki…

RabbitMQ消息队列应用

消息通信组件Net分布式系统的核心中间件之一&#xff0c;应用与系统高并发&#xff0c;各个组件之间解耦的依赖的场景。本框架采用消息队列中间件主要应用于两方面&#xff1a;一是解决部分高并发的业务处理&#xff1b;二是通过消息队列传输系统日志。目前业界使用较多的消息队…

vue插槽面试题_VUE面试题解析,半年出一篇,建议收藏!

回答范例&#xff1a;vuex是vue专用的状态管理库。它以全局方式集中管理应用的状态&#xff0c;并且可以保证状态变更的可预测性。vuex主要解决的问题是多组件之间状态共享的问题&#xff0c;利用各种组件通信方式&#xff0c;我们虽然能够做到状态共享。但是往往需要在多个组件…

常用数据库连接串与驱动总结

1、sql server驱动com.microsoft.sqlserver.jdbc.SQLServerDriver//sql验证jdbc:sqlserver://127.0.0.1:1433;databasenamemydb;Usersa;Password1712682、oracle驱动oracle.jdbc.driver.OracleDriverjdbc:oracle:thin:127.0.0.1:1521:orcl3、mysql驱动com.mysql.jdbc.Driverjdb…

Mysql8.0可以使用解压版 这个比较快 好像现在都是解压版了

https://blog.csdn.net/Charonmomo/article/details/98440968 MySQL-mysql 8.0.17安装 2019年08月04日 09:59:12 Charonmomo 阅读数 1654 标签&#xff1a; MySQL 更多 个人分类&#xff1a; MySQL 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 by-sa 版…

公式冒号是什么意思_三角学中,这么一堆公式其实就说了2个事而已

[遇见数学创作小组] 作者: 心如止水(Java程序员。善于把复杂的数学知识&#xff0c;简洁易懂地表达出来)在学三角这部分的时候&#xff0c;有些书习惯列出诱导公式(induction formula)&#xff0c;都列出来的话可以写小半张纸。那什么是“诱导公式”呢&#xff1f;“诱导公式”…

.NET Core开发:项目实践

初始化项目 本来想详细讲一讲dotnet core的&#xff0c;但我对于dotnet core的研究还不到一星期&#xff0c;半吊子&#xff0c;脑子又笨&#xff0c;就不写那些理论出来误人子弟了&#xff0c;还是直接来一篇实践给大家做个参考。废话不多说&#xff0c;直接上项目&#xff0c…

如何使用jstack分析线程状态

转载自 如何使用jstack分析线程状态背景 记得前段时间&#xff0c;同事说他们测试环境的服务器cpu使用率一直处于100%&#xff0c;本地又没有什么接口调用&#xff0c;为什么会这样&#xff1f;cpu使用率居高不下&#xff0c;自然是有某些线程一直占用着cpu资源&#xff0c;那…

JAVA网络编程实战(笔记)

计算机网络简介 网络编程的目的&#xff1a; 无限电台。。。。传播交流信息&#xff0c;数据交换。通信 想要达到这个效果需要什么&#xff1a; 1.如何准确的定位网络上的一台主机 ip地址192.168.16.124&#xff1a; 端口&#xff0c;定位到这个计算机上的某个资源 2.找到…