/*
=========================================================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;

PL/SQL经典练习相关推荐

  1. PL/SQL学习笔记-常量变量及数据类型初步

    一:常量和变量 开始之前,还是照例做个经典的例子,如下: declare mydate varchar2(16) := 'hellow world'; begindbms_output.put_lin ...

  2. oracle转换指定类型,PL/SQL 类型格式转换

    PL/SQL 类型格式转换 更新时间:2007年03月21日 00:00:00   作者: TO_NUMBER(char[,'format_model'])  字符转换到数字类型 TO_DATE(ch ...

  3. 由DBeaver与PL/SQL引发的数据库吐槽

    因为工作中需要同时面向MySQL.Oracle和SQLServer三种数据库进行开发,所以,大概从去年国庆节开始,我开始使用一个开源的数据库管理工具--DBeaver. 使用这个工具的初衷,是因为我不 ...

  4. Oracle 12c中增强的PL/SQL功能

    英文链接:http://www.oracle.com/technetwork/issue-archive/2013/13-sep/o53plsql-1999801.html Oracle 12c增强了 ...

  5. Oracle数据库学习:PL/SQL(详解)

    Oracle数据库学习:PL/SQL 什么是PL/SQL PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的扩展语言; 使用PL/SQL 可以编写具 ...

  6. PL/SQL常见例题

    在开始接触PL/SQL时,遇到的一些经典的例题,包括循环,函数,游标等几个方面. 码字不易,点个关注给个赞吧 1.       编写PL/SQL程序块,输出100到110之间的所有素数. 代码: de ...

  7. PL/SQL Developer(解压版)连接64位的Oracle11g

    PL/SQL Developer(解压版)连接64位的Oracle11g 在Windows 64位系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时要用P ...

  8. oracle pl/sql 程序设计 历史笔记整理

    20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/yjkhecc@10.85.23.92:1521/orcl 在java ...

  9. PL/SQL ——分页编程

    通过PL/SQL编程,编写分页存储过程.代码如下所示: 1 --PL/SQL开发编写分页代码 2 --创建包 3 create or replace package Page as 4 type te ...

最新文章

  1. 数据库及页面乱码问题
  2. python技术点总结_Python技术点总结,碰到问题再也不用慌了!
  3. pwnable.kr lotto题解
  4. Metal之MTLBuffer批量加载顶点数量较多的图形渲染
  5. mybatis XML格式日期的处理 还有 日期对比的sql
  6. [原创]ActionScript3游戏中的图像编程(连载五)
  7. discuz x2.5 DIY模块模板语法详解
  8. 使用NGINX Plus API动态配置upstream
  9. 在WEB开发的时候导入各种jar包
  10. myeclipse堆栈溢出
  11. Codeblocks下载、安装的详细过程
  12. 软考笔记(九)高级系统架构师/分析师:软件工程与项目管理
  13. 博士申请 | 美国埃默里大学招收2022秋季入学机器学习方向全奖博士生
  14. 微信小程序--音乐播放器案例
  15. [软件使用][视频播放器]potplayer去掉外框
  16. Ubuntu20.04桌面系统快速上手教程
  17. 成功解决: return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
  18. CT一般扫描参数_CT胶片上那些与剂量相关的参数!
  19. 面试题目总结(CNN)
  20. 机器人关节摩擦力的变化规律

热门文章

  1. Sumsets POJ - 2229(计数dp)
  2. 数据结构与算法--数字在排序数组中出现次数
  3. 可持久化Splay 学习笔记
  4. [ARC072C]Alice in linear land(dp,贪心)
  5. AGC056E-Cheese【dp】
  6. P1477-[NOI2008]假面舞会【构图,dfs,gcd】
  7. 2021牛客暑期多校训练营5 D-Double Strings(dp+组合数)
  8. 【动态规划】拔河比赛 (ssl 1638)
  9. 禁用Cookie后,Session怎么样使用
  10. GitHub 发布了一款重量级产品,可直接运行代码