源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 1

随书附带的源码没有序号,部分有bug,调试过程中一并更正。

--代码2.1 使用书序结构计算员工薪资

DECLARE
  v_sal1   NUMBER;
  v_sal2   NUMBER;
  v_sumsal NUMBER;
BEGIN
  SELECT sal
  INTO   v_sal1
  FROM   emp
  WHERE  empno = &empno1;
  SELECT sal
  INTO   v_sal2
  FROM   emp
  WHERE  empno = &empno2;
  v_sumsal := v_sal1 + v_sal2;
  dbms_output.put_line('ID:' || &empno1 || ',' || &empno2 || ',工资之和:' ||
                       v_sumsal);
END;

select * from emp order by sal desc;

--代码2.2 使用分支结构为员工加薪

DECLARE
 --定义加薪比率常量
 c_Manager CONSTANT NUMBER:=0.15;
 c_SalesMan CONSTANT NUMBER:=0.12;
 c_Clerk CONSTANT NUMBER:=0.10;
 c_SR_CONT CONSTANT NUMBER:=0.88;
 --定义工种变量
 v_Job VARCHAR(100);
BEGIN
 --查询指定员工编码的员工信息
 SELECT job INTO v_Job FROM scott.emp WHERE empno=&empNo1;
 --执行分支判断
 IF v_Job='CLERK' THEN
   UPDATE scott.emp SET SAL=SAL*(1+c_Clerk) WHERE empno=&empNo1;
 ELSIF v_Job='SALESMAN' THEN
   UPDATE scott.emp SET SAL=SAL*(1+c_SalesMan) WHERE empno=&empNo1;
 ELSIF v_Job='MANAGER' THEN
   UPDATE scott.emp SET SAL=SAL*(1+c_Manager) WHERE empno=&empNo1;
 ELSIF v_Job='SR.CONT' THEN
   UPDATE scott.emp SET SAL=SAL*(1+c_SR_CONT) WHERE empno=&empNo1;
 END IF;
 --显示完成信息
 DBMS_OUTPUT.PUT_LINE('已经为员工'||&empNo1||'成功加薪!');
 EXCEPTION
 --处理PL/SQL预定义异常
 WHEN NO_DATA_FOUND THEN
   DBMS_OUTPUT.PUT_LINE('没有找到员工数据');
END;

--代码2.3 使用循环结构为所有员工加薪(未使用自定义函数)

DECLARE
 --定义加薪比率常量
 c_Manager CONSTANT NUMBER:=0.15;
 c_SalesMan CONSTANT NUMBER:=0.12;
 c_Clerk CONSTANT NUMBER:=0.10;
 c_Cont CONSTANT NUMBER:=1.00;
 v_Job VARCHAR(100);                         --定义职位变量
 v_EmpNo VARCHAR(20);                        --定义员工编号变量
 v_Ename VARCHAR(60);                        --定义员工名称变量
 CURSOR c_Emp IS SELECT job,empno,ename from Scott.emp FOR UPDATE;
BEGIN
 OPEN c_Emp;   --打开游标
 LOOP          --循环游标
   FETCH c_Emp INTO v_Job,v_EmpNo,v_Ename;   --提取游标数据
   EXIT WHEN c_Emp%NOTFOUND;                 --如果无数据可提取退出游标
 IF v_Job='CLERK' THEN                       --如果为职员,加薪10%
   UPDATE scott.emp SET SAL=SAL*(1+c_Clerk) WHERE CURRENT OF c_Emp;
 ELSIF v_Job='SALESMAN' THEN                 --如果为销售职员,加薪12%
   UPDATE scott.emp SET SAL=SAL*(1+c_SalesMan) WHERE CURRENT OF c_Emp;
 ELSIF v_Job='MANAGER' THEN                  --如果为经理,加薪15%
   UPDATE scott.emp SET SAL=SAL*(1+c_Manager) WHERE CURRENT OF c_Emp;
 ELSIF v_Job='SR.CONT' THEN                  --如果为高级顾问,工资翻倍!
   UPDATE scott.emp SET SAL=SAL*(1+c_Cont) WHERE CURRENT OF c_Emp;
 END IF;
 --显示完成信息
 DBMS_OUTPUT.PUT_LINE('已经为员工'||v_EmpNo||':'||v_Ename||'成功加薪!');
 END LOOP;
 CLOSE c_Emp;                --关闭游标
 EXCEPTION
 WHEN NO_DATA_FOUND THEN     --处理PL/SQL预定义异常
   DBMS_OUTPUT.PUT_LINE('没有找到员工数据');
END; 

--执行动态SQL语句

drop table books;
DECLARE
  v_SQLStr VARCHAR(200):=' CREATE TABLE BOOKS(ID int NOT NULL,BOOKNAME varchar2(100) NULL) ';
BEGIN
  EXECUTE IMMEDIATE v_SQLStr;  --执行DDL语句
END;

--尝试执行静态SQL语句(将发生编译错误)

BEGIN
  CREATE TABLE BOOKS(ID int NOT NULL,BOOKNAME varchar2(100) NULL;
END;

--代码2.4 创建员工对象
CREATE OR REPLACE TYPE Emp_obj AS OBJECT
(
  empno NUMBER(4),     --员工编号属性
  ename VARCHAR2(10),  --员工名称属性
  job VARCHAR(9),      --员工职别属性
  sal NUMBER(7,2),     --员工薪水属性
  deptno NUMBER(2),    --部门编号属性
  --加薪方法
  MEMBER PROCEDURE AddSalary(radio NUMBER)
);
--定义对象类型体,实现对象方法
CREATE OR REPLACE TYPE BODY Emp_obj AS
  --实现对象方法
  MEMBER PROCEDURE  AddSalary(radio NUMBER)
  IS
  BEGIN
    sal:=sal*(1+radio);  --加上特定比例的薪水
  END;
END ;

--代码2.5 创建函数封装业务逻辑

CREATE OR REPLACE FUNCTION GetAddSalaryRatio(p_Job VARCHAR2)
RETURN NUMBER AS
  v_Result NUMBER(7,2);
BEGIN
 IF p_Job='CLERK' THEN                       --如果为职员,加薪10%
   v_Result:=0.10;
 ELSIF p_Job='SALESMAN' THEN                 --如果为销售职员,加薪12%
   v_Result:=0.12;
 ELSIF p_Job='MANAGER' THEN                  --如果为经理,加薪15%
   v_Result:=0.15;
 ELSIF p_Job='cont' THEN                  --如果为顾问,工资翻倍!
   v_Result:=1;
 END IF;
 RETURN v_Result;
END;

--代码2.6 调用函数简化程序逻辑
DECLARE
 v_Job VARCHAR(100);                         --定义职位变量
 v_EmpNo VARCHAR(20);                        --定义员工编号变量
 v_Ename VARCHAR(60);                        --定义员工名称变量
 v_Ratio NUMBER(7,2);
 CURSOR c_Emp IS SELECT job,empno,ename from Scott.emp3 FOR UPDATE;
BEGIN
 OPEN c_Emp;   --打开游标
 LOOP          --循环游标
   FETCH c_Emp INTO v_Job,v_EmpNo,v_Ename;   --提取游标数据
   EXIT WHEN c_Emp%NOTFOUND;                 --如果无数据可提取退出游标
   v_Ratio:=GetAddSalaryRatio(v_Job);        --调用函数,得到加薪率
   UPDATE scott.emp3 SET sal2=sal2*(1+v_Ratio) WHERE CURRENT OF c_Emp;
 --显示完成信息
 DBMS_OUTPUT.PUT_LINE('已经为员工'||v_EmpNo||':'||v_Ename||'成功加薪!');
 END LOOP;
 CLOSE c_Emp;                                --关闭游标
 commit;
 EXCEPTION
 WHEN OTHERS THEN                            --处理PL/SQL预定义异常
   DBMS_OUTPUT.PUT_LINE('没有找到员工数据');

END; 

--代码2.7 最简单的PL/SQL块
BEGIN
  DBMS_OUTPUT.PUT_LINE('Oracle和Mysql差别挺大,PL/SQL是对SQL的增强。');
END;

--代码2.8 完整的PL/SQL语句块
DECLARE
  v_deptcount NUMBER(2);
  v_deptno    NUMBER(2) := 60;
BEGIN
  SELECT COUNT(1)
  INTO   v_deptcount
  FROM   dept
  WHERE  deptno = v_deptno;
  IF v_deptcount = 0
  THEN
    INSERT INTO dept
    VALUES
      (v_deptno, '财务部', '深圳');
    dbms_output.put_line('成功插入部门资料');
  ELSIF v_deptcount = 1
  THEN
    dbms_output.put_line('该部门已存在!');
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line('部门资料插入失败!');
END;
commit;
select * from dept;
时间: 2024-10-10 09:17:53

源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 1的相关文章

网络安全从入门到精通 (第二章-2) 后端基础SQL—MySQL数据库简介及SQL语法

本文内容: 什么是数据库 常见数据库 数据库的基本知识 基本SQL语法 1,什么是数据库? 数据库就是将大量数据保存起来,通过计算机加工,可以高效访问的数据聚合. 数据库就是长期存储在计算机内,有组织.可共享的集合. 2,常见的数据库: Oracle Database 甲骨文公司 SQL Server  微软公司 DB2   IBM公司 POSTGRESQL     开源 MySQL 开源 Access 微软公司 注意:虽然数据库各种各样,但是数据库语句之间具有相同之处. 3,数据库基本知识:

Shell编程从入门到精通-第二章.shell变量

二.Shell变量 2.1.什么是变量 在小学的时候我们学过数学方程式,例如:已知x=1,y=x+1那么y等于多少 在上述的题目中x和y被称为未知数,但是在shell编程里它们是变量名,等号右边的1和x+1是变量的内容,(这里"="被称为赋值) 通过上面的介绍可以得出,变量就是用一个固定的字符串代替更多,更复杂的内容,该内容包含变量.路径.字符串等其他的内容,变量是暂时存储数据的地方和标记,所存储的数据存在内存空间中,通过调用内容空间的变量名字就可以取出变量对应的数据.使用变量最大的好

ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ArcGIS for Desktop是ArcGIS产品线上的桌面端软件产品,为GIS专业人士提供的信息制作和使用的工具.利用ArcGIS for Desktop,你可以实现任何从简单到复杂的GIS任务,包括制图,地理分析,数据编辑,数据管理,可视化和空间处理等.它可以作为三个独立的软件产品购买,每个

NIO入门系列之第二章:通道和缓冲区

第2章 通道和缓冲区 2.1  概述 通道和缓冲区是 NIO 中的核心对象,几乎在每一个I/O 操作中都要使用它们. 通道是对原 I/O 包中的流的模拟.到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象.一个 Buffer 实质上是一个容器对象.发送给一个通道的所有对象都必须首先放到缓冲区中:同样地,从通道中读取的任何数据都要读到缓冲区中. 2.2  什么是缓冲区? Buffer 是一个对象,它包含一些要写入或者刚读出的数据.在 NIO 中加入 Buffer 对象,体

CoreCLR源码探索(七) JIT的h5牛牛源码出售工作原理(入门篇)

很多C#的初学h5牛牛源码出售Q1446595067官网:h5.haozibbs.com者都会有这么一个疑问, .Net程序代码是如何被机器加载执行的? 最简单的解答是, C#会通过编译器(CodeDom, Roslyn)编译成IL代码, 然后CLR(.Net Framework, .Net Core, Mono)会把这些IL代码编译成目标机器的机器代码并执行. 相信大多数的C#的书籍都是这样一笔带过的. 这篇和下篇文章会深入讲解JIT的具体工作流程, 和前面的GC篇一样, 实现中的很多细节都是

【达达前端】Ajax实战项目源码讲解(快速入门的实例)Github源码

作者 | Jeskson 来源 | 达达前端小酒馆 源码地址: https://github.com/huangguangda/Ajaxitm 什么是Ajax技术?实战中的运用ajax技术,了解前后端交互的方式,了解移动端的模式,了解H5的新技术,了解CSS3的使用,和JQuery的使用. Ajax技术可以提高用户体验,无刷新的与后台进行数据的交互,异步的操作方式,可以不用刷新页面提高性能. 了解前后端的交互流程,主要分为三部分,客户端,服务端,数据库,环境搭建,wamp,phpMyAdmin.

VS2015 Git 源码管理工具简单入门

1.VS Git插件 1.1 环境 VS2015+GitLab 1.2 Git操作过程图解 1.3 常见名词解释 拉取(Pull):将远程版本库合并到本地版本库,相当于(Fetch+Meger) 获取(Fetch):从远程版本库获得最新版本 合并(Meger):将两个版本库进行合并操作 提交(Commit):将所做的更改,存入本地暂存库 推送(Push):将所做的更改,存入远程版本库 同步(Pull+Push):先将远程库拉取,再将本地库推送到远程库,相当于(Pull+Push) 变基到(Swi

【转】Visual Studio团队资源管理器 Git 源码管理工具简单入门

1.1 环境 Visual Studio + GitLab (其他版本同理) 1.2 Git操作过程图解 1.3 常见名词解释 拉取(Pull):将远程版本库合并到本地版本库,相当于(Fetch+Meger) 获取(Fetch):从远程版本库获得最新版本 合并(Meger):将两个版本库进行合并操作 提交(Commit):将所做的更改,存入本地暂存库 推送(Push):将所做的更改,存入远程版本库 同步(Pull+Push):先将远程库拉取,再将本地库推送到远程库,相当于(Pull+Push)

【RocketMQ源码学习】- 1. 入门

为什么读RocketMQ 消息队列在互联网应用中使用较为广泛,学习她可以让我门更加了解使用技术的工作原理 透过学习她的源码,拓宽认知 RocketMQ经历了阿里双十一 有哪些名词 Producer 消息生产者,负责产生消息 Consumer 消息消费者,负责消费消息 Producer Group 一类 Producer 的集合名称,这类 Producer 通常发送一类消息,且发送逻辑一致 Consumer Group 一类 Consumer 的集合名称,这类 Consumer 通常消费一类消息,