源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 1
随书附带的源码没有序号,部分有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相关推荐
- 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全家桶的内容我们已经研究过 ...
最新文章
- vb 取得计算机名及目录
- Retrofit全攻略——进阶篇
- vscode使用教程python-教你正确使用VSCode写Python
- SAP UI5的source code map(源代码映射)机制
- 硬货 | 一片小小的薄膜,却可以粘住全世界!
- 排序千万级数据_从千万级房产成交量排名,窥探中国城市的真实家底
- v html是双向绑定吗,vue自定v-model实现表单数据双向绑定问题
- 游戏中的“战争黑雾”和现实中的程序员处境
- 成立20周年之际 阿里巴巴将发布“新六脉神剑”
- 谷歌微软 IBM 激战云端,亚马逊地位恐将不保?
- 接口自动化测试框架必备的9个功能举例
- Vue安装 devTool 时报错的解决办法
- 【opencv-ml】支持向量机简介
- css 固定定位失效问题 position: fixed
- MPEG-TS封装格式数据
- 即学即用英语会话词典
- vue 独享路由守卫
- SDNU1026 田忌赛马续
- 【微信小程序】如何搭积木式开发?
- 如何在桌面上安装运行Rancher 2.0 1