《Oracle PLSQL实例精解》读书笔记
- 导读
- 第一章 PL/SQL概念
- 第二章 PL/SQL语言基础
- 第三章 在PL/SQL中的SQL
- 第四章 条件控制:IF语句
- 第五章 条件控制:CASE语句
- 第六章 迭代控制:第一部分
- 第七章 迭代控制:第二部分
- 第十九章 过程
- 第二十章 函数
导读
以下是一部分读书笔记,内容相对零散,希望在用到时会有一点提示作用。
第一章 PL/SQL概念
- PL/SQL是Oracle对SQL过程语言的扩展。PL/SQL块的PL/SQL语句由PL/SQL语句处理器(PL/SQL引擎)处理,PL/SQL的SQL语句由SQL语句处理器处理。
- PL/SQL块把代表单个逻辑任务的语句组合在一起。PL/SQL块包含三个部分:声明部分、可执行部分和异常处理部分。其中,可执行部分是块中唯一必需的部分。
- PL/SQL基础知识:DBMS_OUTPUT.PUT_LINE语句;替代变量功能,使得PL/SQL能够在运行时接受来自用户的输入,变量名一般以and符号(&)或双and符号(&&)字符作为前缀。
第二章 PL/SQL语言基础
- PL/SQL变量:必须以一个字母开头,PL/SQL不区分大小写。
- PL/SQL保留字:BEGIN、END和SELECT。
- 挂靠的数据类型:v_name student.first_name%TYPE
- 声明和初始化变量:变量可以使用赋值运算符“:=”来赋值
第三章 在PL/SQL中的SQL
1.Select into语法可用于初始化变量(赋值)
2.使用Oracle序列:CURRVAL(返回该序列的当前值)、NEXTVAL(递增序列并返回新值)、
CREATE SEQUENCE eseqINCREMENT BY 5
3 .PL/SQL中的事务控制:COMMIT、ROLLBACK和SAVEPOINT
第四章 条件控制:IF语句
一个ELSIF语句可以包含任意数量的ELSIF子句。
第五章 条件控制:CASE语句
1.CASE语句:WHEN和ELSE子句都包含一个可执行语句,每个可执行语句都以分号结束;以保留词END CASE结束。
2.CASE表达式:WHEN和ELSE子句都包含不以分号结束的表达式;以保留字END结束;CASE表达式常被当作一个列使用;CASE表达式返回单个值,因此具有单一的数据类型,故有时会用到TO_CHAR函数。
3.NULLIF函数:NULLIF(表达式1,表达式2),如果表达式1=表达式2,则返回null,如果表达式1不=表达式2,则返回表达式1。
4.COALESCE函数:COALESCE(表达式1,表达式2,…,表达式N),返回表达式列表中第一个非null表达式的值。
个人感悟:本人在做某行的一个报表导出功能,包括导出明细表和统计报表。该功能涉及了两张表,表关系如下:


一、明细表:在对应实体类的导出字段的get方法上添加@ExcelField
private String instmpdtpcd;
@ExcelField(title="产品类型", align=2, sort=0)
public String getInstmpdtpcd() {return instmpdtpcd;
}
public void setInstmpdtpcd(String instmpdtpcd) {this.instmpdtpcd = instmpdtpcd;
}
再将查询到的符合SQL语句的实体类的list,用项目系统自带的报表导出类导出明细表。
/*** 自定义Excel格式导出* @param request* @param response* @throws IOException*/@RequiresPermissions("lch:lch:edit")@RequestMapping("/export")public void export(HttpServletRequest request, HttpServletResponse response )throws IOException{List aList = getList();HSSFWorkbook wb = lchService.export(aList);response.setContentType("application/vnd.ms-excel");String fname = request.getParameter("fname");String fileName =fname+DateUtils.getDate("yyyyMMddHHmmss");response.addHeader("Content-Disposition", "attachment;filename="+ java.net.URLEncoder.encode(fileName, "UTF-8")+".xls"); OutputStream outputStream = response.getOutputStream();wb.write(outputStream);outputStream.flush();outputStream.close();}private List getList() {ArrayList infoList = new ArrayList();List sysInboxList = sysInboxService.findAllList(new SysInbox());List sysTypeinList = sysTypeinService.findAllList(new SysTypein());for (SysInbox sysInbox : sysInboxList) {ApplyInformation info = new ApplyInformation();info.setInstmpdtpcd(sysInbox.getInstmpdtpcd());// 产品类型(分期产品类型) SysInboxinfo.setInstmacptinsid(sysInbox.getInstmacptinsid()); // 受理机构代码 SysInboxinfo.setT3instchnshrtnm(sysInbox.getT3instchnshrtnm()); //受理机构名称 SysInboxinfo.setMarketingorganizationcode(sysInbox.getCmpninsid()); // 营销机构代码 【新增】info.setMarketingorganizationname(sysInbox.getCmpninsnm()); //营销机构名称【新增】info.setInstmacptempid(sysInbox.getInstmacptempid()); // 受理人员代码 SysInboxinfo.setMarketercode(sysInbox.getCmpnempid()); // 营销人员代码 【新增】info.setCrcrdaplid(sysInbox.getCrcrdaplid()); //申请书编号(信用卡申请编号) SysInboxinfo.setAplypsnnm(sysInbox.getAplypsnnm()); // 申请人姓名 SysInboxinfo.setDatabsndt(sysInbox.getDatabsndt()); //进件日期(数据业务日期) SysInbox infoList.add(info);} return infoList;}
这里有两种生成SQL语句的写法,一种是使用mybatis的外键关联标签(较复杂,不推荐使用):
另一种是直接用左右关联,返回符合条件的Map(实例省略)。
二、统计报表:当操作复杂的统计报表时,SQL语句根本无法满足一次性查出需求,会迫使java逻辑代码处理来自mybatis查询到的多条SQL,非常不便。此时,就要用到PL/SQL,通过PL/SQL块把代表单个逻辑任务的语句组合在一起,使得在mybatis的xml文件仅用一条PL/SQL语句块,就将整个报表的所需字段查出。
Mybatis.xml:
Controller:
/*** ②分期档案上送情况报表(日报、月报)* @param sysInbox* @param request* @param response* @param redirectAttributes* @throws IOException */@RequiresPermissions("file:sysInbox:view")@RequestMapping(value = "table2")public void table2(SysInbox sysInbox, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) throws IOException {//sysInbox.setAssignedtask("cxgw");//拥有与查询岗位相同的查询功能HashMap timeParamMap;String startTime = request.getParameter("startTime");String endTime = request.getParameter("endTime");timeParamMap = Maps.newHashMap();timeParamMap.put("startTime", startTime);timeParamMap.put("endTime", endTime);sysInbox.setParamMap(timeParamMap);User user = UserUtils.getUser();sysInbox.setUserCompanyId(user.getCompany().getId());String fname = request.getParameter("fname");List
Service:
/*** ②分期档案上送情况报表(日报、月报)* @param list* @return*/@SuppressWarnings("deprecation")public HSSFWorkbook table2(List
Dao:
//获得table2报表的数据Map
public List
第六章 迭代控制:第一部分
- 简单循环:LOOP语句,使用EXIT WHEN添加无限循环的退出条件。
- WHILE循环:
- 数字FOR循环:保留字FOR标志着循环结构的开始。变量loop_counter是一个隐含定义的索引变量。没有必要再PL/SQL块的声明部分中定义循环计数器。当使用数字FOR循环时,循环计数器是隐含地定义和递增的。
第七章 迭代控制:第二部分
继续条件:CONTINUE语句和CONTINUE WHEN语句,退出条件会终止循环,而继续条件会终止循环的当前迭代。
第十九章 过程
第二十章 函数
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!