PLSQL重点问题理解和实战
一 ORACLE中PL/SQL使用的集合变量类型有RECORD(类)、VARRAY(sql数组)、TABLE(嵌套表)
TABLE(嵌套表) 可以加index定义也可以不加,加表示index by是建立主键索引相当于数组,不加就是个嵌套表集合
1 TABLE(嵌套表)定义表变量类型
type type_table_emp_empno is table of emp.empno%type index by binary_integer;--TYPE表示表中一行中字段类型
v_empnos type_table_emp_empno;
如果用%type定义
定义集合变量v_empnos 是一个有emp.empno字段类型的数组,自己理解是存放实际还是一个表,里面只有一个字段,且字段上有索引
对此集合变量(is table of index by)类型的操作 包括count,delete,但不能用trim
对VARRAY 可以用count,delete和trim
使用形式
select to_char(truck_in_out_id),
employee_id,
employee_nm,
truck_in_purpose
bulk collect into
carid,
empid,
empnm,
dest
forall i in 1 .. carid.COUNT
update cpnew.CP_VISIT_APPLY a
set a.mgr_principal_id = empid(i),
a.mgr_principal_nm = empnm(i),
a.visit_dest = dest(i)
where a.visit_apply_id = carid(i)
and a.mgr_principal_id is null;
type delArray1 is table of TEST.COURSE%ROWTYPE index by binary_integer; --ROWTYPE表示表中一行的记录类型
cur_result delArray1;
如果用%rowtype定义
定义集合变量cur_result是一个COURSE表类型的集合,自己理解是按一个表存放,里面包括COURSE的所有字段类型,且用整形数做这个表的索引
使用形式
select * bulk collect into cur_result
forall i in 1 .. cur_result.COUNT
update cpnew.CP_VISIT_APPLY a
set a.mgr_principal_id = cur_result(i).empid,
a.mgr_principal_nm = cur_result(i).empnm,
a.visit_dest = cur_result(i).dest
where a.visit_apply_id = cur_result(i).carid
and a.mgr_principal_id is null;
实际工作中的例子
plsql 大数据量删除,修改的方法FORALL加bulk collection into
create or replace procedure zl_del_UPDATEAPPLY_DEST187 as
--type ridArray is table of rowid index by binary_integer;
type delArray1 is table of varchar2(32) index by binary_integer;
type delArray2 is table of CP_2012.CP_VISIT_TRUCK_INOUT.employee_id%type index by binary_integer;
type delArray3 is table of CP_2012.CP_VISIT_TRUCK_INOUT.employee_nm%type index by binary_integer;
type delArray4 is table of CP_2012.CP_VISIT_TRUCK_INOUT.truck_in_purpose%type index by binary_integer;
//你会发现用%type就得每个字段都得定义他的类型
carid delArray1;
empid delArray2;
empnm delArray3;
dest delArray4;
begin
select to_char(truck_in_out_id),
employee_id,
employee_nm,
truck_in_purpose
bulk collect into
carid,
empid,
empnm,
dest
from CP_2012.CP_VISIT_TRUCK_INOUT;
--where rownum < 600001;
forall i in 1 .. carid.COUNT
update cpnew.CP_VISIT_APPLY a
set a.mgr_principal_id = empid(i),
a.mgr_principal_nm = empnm(i),
a.visit_dest = dest(i)
where a.visit_apply_id = carid(i)
and a.mgr_principal_id is null;
DBMS_OUTPUT.PUT_LINE(to_char(carid.COUNT) ||
' records deleted from temp_mid_hubei_bak !!!');
end;
这种方法最大缺点是forall里不能访问远程表,也不能用dblink,且只能放dml语句不能用dbms.putline
经过测试过发现for可以替代forall尽管时间相对慢一点,但也能接受,所以可以在for中用dblink,相应语句如下:
for i in 1 .. carid.COUNT
loop
update cpnew.CP_VISIT_APPLY@LINK_213TO187_CPNEW a
set a.mgr_principal_id = empid(i),
a.mgr_principal_nm = empnm(i),
a.visit_dest = dest(i)
where a.visit_apply_id = carid(i)
and a.mgr_principal_id is null;
2 Record变量类型:(相当于java的类)
定义
type type_record_dept is record
(
deptno dept.deptno%type,
dname dept.dname%type,
loc dept.loc%type
);
v_temp type_record_dept;
3 VARRAY
定义和使用
CREATE OR REPLACE TYPE numbers_t IS VARRAY (5) OF NUMBER
DECLARE
l_list numbers_t:= numbers_t (1, 2, 3, 4, 5);
BEGIN
l_list.DELETE;
DBMS_OUTPUT.put_line (CASE l_list.COUNT WHEN 0 THEN 'Empty' END);
END;
数组使用例子 参考 Oracle数组的使用 http://blog.itpub.net/12932950/viewspace-351791/
还可以对比本人之前的blog查看游标和bulk collect into的用法 http://blog.itpub.net/750077/viewspace-2075986/
二 PL/SQL异常
异常类型 1预定义的异常处理,2非预定义 ( Predefined )错误,3用户定义(User_define) 错误
一般预定义和用户定义异常使用较多
1预定义异常 如oracle已定义的异常
ORA-1403 No_data_found SELECT INTO没有找到数据
使用时如果select没查出数据时就直接处理没找到数据的异常
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('数据库中没有编码为'||v_empno||'的员工');
END;
2用户自定义异常
用户先定义异常
no_result EXCEPTION;
如没有更新的数据时,抛出这个异常
UPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;
IF SQL%NOTFOUND THEN
RAISE no_result;
END IF;
然后处理这个异常
EXCEPTION
WHEN no_result THEN
DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;
SQLCODE,SQLERRM是ORACLE函数,会打印错误代码和错误名称
参考 ORACLE PL/SQL编程之五:异常错误处理 https://www.cnblogs.com/huyong/archive/2011/05/06/2038743.html
后续持续更新
......
PLSQL重点问题理解和实战相关推荐
- Kotlin中协程理解与实战(一)
Kotlin中协程理解与实战(一) 什么是协程 在Android中协程用来解决什么问题 协程是: suspend -也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量: resume -用于让 ...
- 区块链共识之Paxos算法理解与实战
0.前言 本文记录笔者学习和理解区块链共识算法Paxos的点滴,文章比较长,需要耐心来细细琢磨,笔者也是苦战了一个周末才对此有那么一点初步了解,有问题的地方请不吝斧正! 1.初始是阅读本文后续内容的基 ...
- Docker小白入门教程--docker理解与实战(懵逼三连--Docker是什么,为什么要使用Docker,如何使用Docker?)
站在巨佬的肩膀上,才能看的更远!(没错这篇文章就是大量援引国内外网上各位大佬的博客,外加我这个小菜初入docker的一些理解,整理一下所学,也是为了方便我自己在暑假过完后,被别人问起docker问到我 ...
- 三、Python复习教程(重点)- 前端框架实战
目录导航: 文章目录 目录导航: 五.Django商城项目开发(上) 1. 项目需求分析 ①. 项目开发流程 (1). 软件开发过程的划分 (2). 软件开发流程 (3). 软件开发过程域遵循的标准文 ...
- 重新理解 Go 实战
点击上方蓝字关注我们 昨天很多人都看到我们GoCN社区和慕课网联合发布的<Go 高级程序员实战营>培训课程,看到内容的第一眼大家都很惊讶,为什么这个培训内容这么接地气,当然很多人纷纷私信我 ...
- AB-test理解与实战
AB-test 1.定义:为同一个目标制定两个方案,在同一时间维度,分别让组成成分相同(相似)的用户群组随机的使用一个方案,收集各群组的用户体验数据和业务数据,最后根据显著性检验分析评估出较好的方案. ...
- Wide Deep模型的理解及实战(Tensorflow)
目录 一.背景 二.概述 三.模型原理 3.1.Wide模型 3.2.Deep模型 3.3.Wide和Deep模型的协同训练 四.系统介绍 4.1.系统简介 4.2.系统流程 五.tensorflow ...
- 深入理解虚拟机实战:修改class文件实现System标准输出重定向
一.背景 在深入理解Java虚拟机的过程中,理解java程序在虚拟机层次如何执行十分重要.了解了深层次的东西,才可以实现一般情况下做不到的特殊功能,而这种特殊功能面向的对象往往是程序员本身.下面我们通 ...
- PLSQL - Months_Between的理解和使用
Months_Between是一个内置的日期操纵函数,用于计算两个日期相隔的月份数.Oracle文档的介绍如下: MONTHS_BETWEEN returns number of months bet ...
最新文章
- 使用嵌套的Repeater控件显示分级数据
- 记一次性能优化,单台4核8G机器支撑5万QPS
- VTK:平行坐标用法实战
- 【软件工程导论题型大总结】名词解释总结
- 计算机网络在城市轨道交通运营中的应用,开题报告-GIS在宁波城市轨道交通建设、管理与运营中的应用分析.doc...
- 某大型银行深化系统技术方案之十二:服务层之服务分类
- 浅析 路印协议--Loopring 及整体分析 Relay 源码
- Appium Desktop下载
- mysql如何清空数据库表内容
- Apache的安装教程
- 应用排行榜第一名脸萌只是刹那的烟火
- 远程连接服务器出现channel is not opened通道未打开
- Windows 10 截图工具
- java tapestry_java Tapestry4.1.2入门说明教程
- Vmware Ubuntu虚拟机提示:无法连接虚拟设备 sata0:1,因为主机上没有相对应的设备,解决办法
- Ryzen3 2200g安装Debian11.1后配置VBox
- (4.1.40.5)Android手势检测GestureDecetor详解
- php文件直链源码,蓝奏网盘文件夹直链解析源码
- Tableau表计算(1):计算类型
- Binary Cross Entropy
热门文章
- ajax 请求超过了5s 还没有返回 的话 就自动取消
- Oracle数据库命令行下数据的导入导出
- 005-对象——对象的 final const
- 【笔记】与Android选项卡一周
- 《JavaScript设计模式与开发实践》读书笔记之观察者模式
- ResourceLoader
- Mac下配置cocos2d-x开发环境(android和ios)
- 【Java基础】重写与重载
- java输出孪生素数对数_为什么孪生素数、波利尼亚克、哥德巴赫这些素数加减关系的猜想不能被证明?问题出在哪?...
- sudo mount -o loop pm.img /mnt/floppy/mount 错误解决办法--mount 您必须指定文件系统的类型