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

--代码2.1 使用书序结构计算员工薪资DECLAREv_sal1   NUMBER;v_sal2   NUMBER;v_sumsal NUMBER;
BEGINSELECT salINTO   v_sal1FROM   empWHERE  empno = &empno1;SELECT salINTO   v_sal2FROM   empWHERE  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' THENUPDATE scott.emp SET SAL=SAL*(1+c_Clerk) WHERE empno=&empNo1;ELSIF v_Job='SALESMAN' THENUPDATE scott.emp SET SAL=SAL*(1+c_SalesMan) WHERE empno=&empNo1;   ELSIF v_Job='MANAGER' THENUPDATE scott.emp SET SAL=SAL*(1+c_Manager) WHERE empno=&empNo1;ELSIF v_Job='SR.CONT' THENUPDATE 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 THENDBMS_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;
BEGINOPEN 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;                --关闭游标 EXCEPTIONWHEN NO_DATA_FOUND THEN     --处理PL/SQL预定义异常DBMS_OUTPUT.PUT_LINE('没有找到员工数据');
END; --执行动态SQL语句drop table books;
DECLAREv_SQLStr VARCHAR(200):=' CREATE TABLE BOOKS(ID int NOT NULL,BOOKNAME varchar2(100) NULL) ';
BEGINEXECUTE IMMEDIATE v_SQLStr;  --执行DDL语句
END;--尝试执行静态SQL语句(将发生编译错误)BEGINCREATE 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)ISBEGINsal:=sal*(1+radio);  --加上特定比例的薪水END;
END ;--代码2.5 创建函数封装业务逻辑CREATE OR REPLACE FUNCTION GetAddSalaryRatio(p_Job VARCHAR2)
RETURN NUMBER ASv_Result NUMBER(7,2);
BEGINIF 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 调用函数简化程序逻辑
DECLAREv_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;
BEGINOPEN 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;EXCEPTIONWHEN OTHERS THEN                            --处理PL/SQL预定义异常DBMS_OUTPUT.PUT_LINE('没有找到员工数据');END; --代码2.7 最简单的PL/SQL块
BEGINDBMS_OUTPUT.PUT_LINE('Oracle和Mysql差别挺大,PL/SQL是对SQL的增强。');
END;--代码2.8 完整的PL/SQL语句块
DECLAREv_deptcount NUMBER(2);v_deptno    NUMBER(2) := 60;
BEGINSELECT COUNT(1)INTO   v_deptcountFROM   deptWHERE  deptno = v_deptno;IF v_deptcount = 0THENINSERT INTO deptVALUES(v_deptno, '财务部', '深圳');dbms_output.put_line('成功插入部门资料');ELSIF v_deptcount = 1THENdbms_output.put_line('该部门已存在!');END IF;
EXCEPTIONWHEN OTHERS THENdbms_output.put_line('部门资料插入失败!');
END;
commit;
select * from dept;

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

  1. Android -- 带你从源码角度领悟Dagger2入门到放弃(一)

    1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...

  2. Redis源码阅读,从入门到放弃

    作为后端工程师,我们在面试和工作中都会用到 Redis,特别是大型互联网公司面试时,不仅要求面试者能简单使用 Redis,还要求懂 Redis 源码层面的实现原理,具备解决常见问题的能力.可以说,熟练 ...

  3. wlan从入门到精通第四期WLAN常用概念

    wlan从入门到精通第四期WLAN常用概念 SSID的全称是Service Set Identifier,也就是服务集标识符,用于标识一个服务集,按照大部分人的理解,也就是用来标识一个可用的网路. 我 ...

  4. Java从入门到精通 第九章 数字处理类

    Java从入门到精通 第九章 数字处理类 一.数字格式化 二.数学运算 1)Math类 2)常用数学运算方法 三.随机数 1)Math.random()方法 2)Random类 四.大数字运算 1)B ...

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

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

  6. SQL基础教程MICK版 ···第二章总结

    SQL基础教程MICK版 ···第二章总结 前期准备 SELECT 语句基础 算术运算符.比较运算符和 NOT运算符 特殊的NULL 逻辑运算符 前期准备 应用第一章学的 建一个数据库 在该库中 建立 ...

  7. SQL由入门到精通的学习

    SQL 21 日自学通(V1.0) 翻译人笨猪 EMAIL wyhsillypig@163.com 1 目录 目录........................................... ...

  8. 尖峰 mysql 源码方向_MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图...

    一:背景 1. 讲故事 最近看各大技术社区,不管是知乎,掘金,博客园,csdn基本上看不到有小伙伴分享sqlserver类的文章,看样子这些年sqlserver没落了,已经后继无人了,再写sqlser ...

  9. 源码 连接mysql_MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图...

    一:背景 1. 讲故事 最近看各大技术社区,不管是知乎,掘金,博客园,csdn基本上看不到有小伙伴分享sqlserver类的文章,看样子这些年sqlserver没落了,已经后继无人了,再写sqlser ...

  10. vuex 源码分析_前端入门之(vuex-router-sync解析)

    前端入门之(vuex-router-sync解析) 发布时间:2018-11-14 13:31, 浏览次数:513 , 标签: vuex router sync 前言:vue全家桶的内容我们已经研究过 ...

最新文章

  1. vb 取得计算机名及目录
  2. Retrofit全攻略——进阶篇
  3. vscode使用教程python-教你正确使用VSCode写Python
  4. SAP UI5的source code map(源代码映射)机制
  5. 硬货 | 一片小小的薄膜,却可以粘住全世界!
  6. 排序千万级数据_从千万级房产成交量排名,窥探中国城市的真实家底
  7. v html是双向绑定吗,vue自定v-model实现表单数据双向绑定问题
  8. 游戏中的“战争黑雾”和现实中的程序员处境
  9. 成立20周年之际 阿里巴巴将发布“新六脉神剑”
  10. 谷歌微软 IBM 激战云端,亚马逊地位恐将不保?
  11. 接口自动化测试框架必备的9个功能举例
  12. Vue安装 devTool 时报错的解决办法
  13. 【opencv-ml】支持向量机简介
  14. css 固定定位失效问题 position: fixed
  15. MPEG-TS封装格式数据
  16. 即学即用英语会话词典
  17. vue 独享路由守卫
  18. SDNU1026 田忌赛马续
  19. 【微信小程序】如何搭积木式开发?
  20. 如何在桌面上安装运行Rancher 2.0 1

热门文章

  1. IE7IE8不支持rgba的方法
  2. javascript高级程序设计---document节点
  3. python实现文件压缩
  4. 如何对一个变量数据进行正则判定_数值数据与数值数据的分析
  5. #怎样获取当前时间和时区_JDK1.8新增日期时间类型
  6. C++中编译速度与平时代码规范
  7. 为初学者收集的一些C语言学习资料
  8. 20款开源搜索引擎介绍与比较
  9. 如何安装Catfish(鲶鱼)
  10. 一个批量文件改名工具