随书光盘中的源码没有序号,部分找不到或者有bug,调试过程中一并更正。

其中,还有两个彩蛋:“双十九”乘法口诀表和“双九九”加法口诀表的输出(PL/SQL实现),以及一个附加(加薪函数的调用)

代码如下:

--代码2.9 使用嵌套块更新和插入部门表
/*说明:
1.随书源代码中v_deptno前缺少&符号,导致异常处理模块报错“ORA-01400: 无法将 NULL 插入”。
本人调试了半天,才发现问题所在,现已修复。
2.此段代码为手工录入,因为在随书光盘中未找到*/
/*以下为调试过程中使用的sql语句:
create table dept2 as select * from dept;
select * from dept2;
drop table dept2;*/DECLAREv_deptno    NUMBER(2);v_deptname  VARCHAR2(14);
BEGIN--内部嵌套块BEGINSELECT dnameINTO   v_deptnameFROM   dept2WHERE  deptno = &v_deptno;DBMS_OUTPUT.PUT_LINE('您查询的部门名称为:' || v_deptname);END;--内部嵌套块DECLAREv_loc VARCHAR2(13) := '上海浦东';BEGINUPDATE dept2SET    loc = v_locWHERE  deptno = v_deptno;DBMS_OUTPUT.PUT_LINE('在内部嵌套块中成功更新部门资料');COMMIT;END;
EXCEPTIONWHEN NO_DATA_FOUND THENBEGININSERT INTO dept2VALUES (&v_deptno,'IT开发','全球');DBMS_OUTPUT.PUT_LINE('在异常处理嵌套块成功新增部门资料');COMMIT;EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(SQLERRM);END;
END;--代码2.10 命名嵌套块(在代码2.9中增加了<<查询与员工名称块>>等三个标签)
DECLAREv_deptno    NUMBER(2);v_deptname  VARCHAR2(14);
BEGIN--内部嵌套块<<查询员工名称块>>BEGINSELECT dnameINTO   v_deptnameFROM   dept2WHERE  deptno = &v_deptno;DBMS_OUTPUT.PUT_LINE('您查询的部门名称为:' || v_deptname);END;--内部嵌套块<<更新员工记录块>>DECLAREv_loc VARCHAR2(13) := '上海浦东';BEGINUPDATE dept2SET    loc = v_locWHERE  deptno = v_deptno;DBMS_OUTPUT.PUT_LINE('在内部嵌套块中成功更新部门资料');COMMIT;END;
EXCEPTIONWHEN NO_DATA_FOUND THEN<<插入员工记录块>>BEGININSERT INTO dept2VALUES (&v_deptno,'IT开发','全球');DBMS_OUTPUT.PUT_LINE('在异常处理嵌套块成功新增部门资料');COMMIT;EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(SQLERRM);END;
END;--代码2.11 PL/SQL变量定义示例
DECLAREv_DeptName VARCHAR2(10);        --定义标量变量v_LoopCounter BINARY_INTEGER;   --使用PL/SQL类型定义标量变量--定义记录类型TYPE t_Employee IS RECORD (EmpName VARCHAR2(20),EmpNo NUMBER(7),Job VARCHAR2(20));v_Employee t_Employee;          --定义记录类型变量TYPE csor IS REF CURSOR;        --定义游标变量v_date DATE NOT NULL DEFAULT SYSDATE;--定义变量并指定默认值
BEGINNULL;
END;
/--代码2.12 使用CASE进行条件判断
CREATE OR REPLACE FUNCTION GetAddSalaryRatioCASE(p_Job VARCHAR2)
RETURN NUMBER ASv_Result NUMBER(7,2);
BEGIN  CASE p_Job                     --使用CASE WHEN语句进行条件判断WHEN 'CLERK' THEN              --职员v_Result:=0.10;WHEN 'SALESMAN' THEN           --销售v_Result:=0.12;WHEN 'MANAGER' THEN            --经理v_Result:=0.15;WHEN 'cont' THEN            --consultant,翻倍v_Result:=1;END CASE; RETURN v_Result;                --返回值
END;--代码2.13 使用FOR循环打印九九乘法口诀表
DECLAREv_Number1 NUMBER(3);  --外层循环变量v_Number2 NUMBER(3);  --内存循环变量
BEGIN  FOR v_Number1 IN 1..9 --开始外层循环LOOP--进行内存循环FOR v_Number2 IN 1..v_Number1LOOP--打印口决内容DBMS_OUTPUT.PUT(v_Number1||'*'||v_Number2||'='||v_Number1*v_Number2||'   ');END LOOP; --输出换行  DBMS_OUTPUT.PUT_LINE('');END LOOP;
END;--彩蛋1 使用FOR循环打印“双十九”乘法口诀表(印度乘法口诀表)
DECLAREv_Number1 NUMBER(3);  --外层循环变量v_Number2 NUMBER(3);  --内存循环变量
BEGIN  FOR v_Number1 IN 1..19 --开始外层循环LOOP--进行内存循环FOR v_Number2 IN 1..v_Number1LOOP--打印口决内容--第十行缩进,使得输出更美观DBMS_OUTPUT.PUT  (v_Number1||'*'||v_Number2||'='||v_Number1*v_Number2||'    ');END LOOP; --输出换行  DBMS_OUTPUT.PUT_LINE('');END LOOP;
END;--彩蛋2 使用FOR循环打印“双九九”加法口诀表
DECLAREv_Number1 NUMBER(3);  --外层循环变量v_Number2 NUMBER(3);  --内存循环变量
BEGIN  FOR v_Number1 IN 1..19 --开始外层循环LOOP--进行内存循环FOR v_Number2 IN 1..v_Number1LOOP--打印口决内容--第十行缩进,使得输出更美观DBMS_OUTPUT.PUT  (v_Number1||'+'||v_Number2||'='||(v_Number1+v_Number2)||'    ');END LOOP; --输出换行  DBMS_OUTPUT.PUT_LINE('');END LOOP;
END;--创建为员工加薪的过程
CREATE OR REPLACE PROCEDURE AddEmpSalary(p_Ratio NUMBER,p_EmpNo NUMBER)
AS
BEGINIF p_Ratio>0 THEN         --判断传入的参数是否大于0--如果大于0,则更新Emp表中的数据UPDATE scott.emp3 SET sal2=sal2*(1+p_Ratio) WHERE EMPNO=p_EmpNo;END IF;--提示加薪成功。DBMS_OUTPUT.PUT_LINE('加薪成功!');
END;--附加:调用加薪函数
DECLAREv_empno NUMBER(4);v_sal2  VARCHAR2(14);v_ratio  VARCHAR2(14);
BEGINSELECT sal2INTO   v_sal2FROM   emp3WHERE  empno = &v_empno;addempsalary(&v_ratio, &v_empno);DBMS_OUTPUT.PUT_LINE('员工'||&v_empno||'已成功加薪百分之'||&v_ratio*100);commit;
EXCEPTIONWHEN NO_DATA_FOUND THENBEGINDBMS_OUTPUT.PUT_LINE('未找到该员工!');EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(SQLERRM);END;
END;update emp3 set sal2=5120000 where empno=7509;--代码2.15 员工加薪管理保代码
/*包规范定义,不包括实现代码*/
CREATE OR REPLACE PACKAGE EmpSalary
AS
--执行实际的加薪动作
PROCEDURE AddEmpSalary(p_Ratio NUMBER,p_EmpNo NUMBER);
--使用IF-ELSIF语句得到加薪比率
FUNCTION GetAddSalaryRatio(p_Job VARCHAR2) RETURN NUMBER;
--使用CASE语句得到加薪比率
FUNCTION GetAddSalaryRatioCASE(p_Job VARCHAR2) RETURN NUMBER;
END EmpSalary;
/
/*包体定义*/
CREATE OR REPLACE PACKAGE BODY EmpSalary
ASPROCEDURE AddEmpSalary(p_Ratio NUMBER,p_EmpNo NUMBER)ASBEGINIF p_Ratio>0 THEN         --判断传入的参数是否大于0--如果大于0,则更新Emp表中的数据UPDATE scott.emp SET sal=sal*(1+p_Ratio) WHERE EMPNO=p_EmpNo;END IF;--提示加薪成功。DBMS_OUTPUT.PUT_LINE('加薪成功!');END;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;END IF;RETURN v_Result;   END; FUNCTION GetAddSalaryRatioCASE(p_Job VARCHAR2)RETURN NUMBER ASv_Result NUMBER(7,2);BEGIN  CASE p_Job                     --使用CASE WHEN语句进行条件判断WHEN 'CLERK' THEN              --职员v_Result:=0.10;WHEN 'SALESMAN' THEN           --销售v_Result:=0.12;WHEN 'MANAGER' THEN            --经理v_Result:=0.15;END CASE; RETURN v_Result;                --返回值END;
END EmpSalary;


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

  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. 计算机考研b区国家线,考研b区国家线历年分数线情况
  2. 2021甘肃省高考成绩查询日期,2021年甘肃省高考分数公布时间
  3. Winform中使用DevExpress时给控件添加子控件的方法
  4. 手机的次世代竞争年代
  5. python--装饰器(附偏函数、断言)
  6. LeetCode每日打卡 - 反转每对括号间的子串
  7. php pdo批量操作,PDO使用二维数组批量操作MYSQL数据库
  8. GCC为什么不将a * a * a * a * a * a优化为(a * a * a)*(a * a * a)?
  9. MySQL INFORMATION_SCHEMA信息数据库
  10. 小心:网上几乎所有的Kms-pico都带木马
  11. AndroidStudio实现在图片上涂鸦并记录涂鸦轨迹
  12. mac整站下载工具httrack
  13. 无数次踩坑安装AWVS
  14. 给JavaScript 初心者的ES2015 实战
  15. MySQL系列之STRAIGHT JOIN用法简介
  16. 22考研初试410数一145上岸上海交通大学819经验分享
  17. 支持向量机——SVM算法及例子(代码)
  18. Git--SSH登录
  19. 清北计算机导论,北京科技大学强军计划考研盛世清北北科强军计划考研经验分享.docx...
  20. linux 时间与bios,Linux操作系统时间与BIOS硬件时间

热门文章

  1. 使用python语言编写脚本控制freeswitch总结
  2. JVM(四)—一道面试题搞懂JVM类加载机制
  3. getopt/getopt_long函数使用说明
  4. 解析域名地址并生成win路由增强版
  5. arm cpu的架构及分类说明
  6. 通过BeanDefinitionReader获取BeanDefinition的三种不同方式
  7. yagmail发送邮件
  8. OpenCasCade图元拖动问题
  9. 探讨【IGE】的源代码【一】。
  10. java中级项目案例_60个Java练手项目案例,看了让你茅塞顿开~