源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 2
随书光盘中的源码没有序号,部分找不到或者有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相关推荐
- Android -- 带你从源码角度领悟Dagger2入门到放弃(一)
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...
- Redis源码阅读,从入门到放弃
作为后端工程师,我们在面试和工作中都会用到 Redis,特别是大型互联网公司面试时,不仅要求面试者能简单使用 Redis,还要求懂 Redis 源码层面的实现原理,具备解决常见问题的能力.可以说,熟练 ...
- wlan从入门到精通第四期WLAN常用概念
wlan从入门到精通第四期WLAN常用概念 SSID的全称是Service Set Identifier,也就是服务集标识符,用于标识一个服务集,按照大部分人的理解,也就是用来标识一个可用的网路. 我 ...
- Java从入门到精通 第九章 数字处理类
Java从入门到精通 第九章 数字处理类 一.数字格式化 二.数学运算 1)Math类 2)常用数学运算方法 三.随机数 1)Math.random()方法 2)Random类 四.大数字运算 1)B ...
- ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...
- SQL基础教程MICK版 ···第二章总结
SQL基础教程MICK版 ···第二章总结 前期准备 SELECT 语句基础 算术运算符.比较运算符和 NOT运算符 特殊的NULL 逻辑运算符 前期准备 应用第一章学的 建一个数据库 在该库中 建立 ...
- SQL由入门到精通的学习
SQL 21 日自学通(V1.0) 翻译人笨猪 EMAIL wyhsillypig@163.com 1 目录 目录........................................... ...
- 尖峰 mysql 源码方向_MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图...
一:背景 1. 讲故事 最近看各大技术社区,不管是知乎,掘金,博客园,csdn基本上看不到有小伙伴分享sqlserver类的文章,看样子这些年sqlserver没落了,已经后继无人了,再写sqlser ...
- 源码 连接mysql_MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图...
一:背景 1. 讲故事 最近看各大技术社区,不管是知乎,掘金,博客园,csdn基本上看不到有小伙伴分享sqlserver类的文章,看样子这些年sqlserver没落了,已经后继无人了,再写sqlser ...
- vuex 源码分析_前端入门之(vuex-router-sync解析)
前端入门之(vuex-router-sync解析) 发布时间:2018-11-14 13:31, 浏览次数:513 , 标签: vuex router sync 前言:vue全家桶的内容我们已经研究过 ...
最新文章
- 计算机考研b区国家线,考研b区国家线历年分数线情况
- 2021甘肃省高考成绩查询日期,2021年甘肃省高考分数公布时间
- Winform中使用DevExpress时给控件添加子控件的方法
- 手机的次世代竞争年代
- python--装饰器(附偏函数、断言)
- LeetCode每日打卡 - 反转每对括号间的子串
- php pdo批量操作,PDO使用二维数组批量操作MYSQL数据库
- GCC为什么不将a * a * a * a * a * a优化为(a * a * a)*(a * a * a)?
- MySQL INFORMATION_SCHEMA信息数据库
- 小心:网上几乎所有的Kms-pico都带木马
- AndroidStudio实现在图片上涂鸦并记录涂鸦轨迹
- mac整站下载工具httrack
- 无数次踩坑安装AWVS
- 给JavaScript 初心者的ES2015 实战
- MySQL系列之STRAIGHT JOIN用法简介
- 22考研初试410数一145上岸上海交通大学819经验分享
- 支持向量机——SVM算法及例子(代码)
- Git--SSH登录
- 清北计算机导论,北京科技大学强军计划考研盛世清北北科强军计划考研经验分享.docx...
- linux 时间与bios,Linux操作系统时间与BIOS硬件时间