一 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重点问题理解和实战相关推荐

  1. Kotlin中协程理解与实战(一)

    Kotlin中协程理解与实战(一) 什么是协程 在Android中协程用来解决什么问题 协程是: suspend -也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量: resume -用于让 ...

  2. 区块链共识之Paxos算法理解与实战

    0.前言 本文记录笔者学习和理解区块链共识算法Paxos的点滴,文章比较长,需要耐心来细细琢磨,笔者也是苦战了一个周末才对此有那么一点初步了解,有问题的地方请不吝斧正! 1.初始是阅读本文后续内容的基 ...

  3. Docker小白入门教程--docker理解与实战(懵逼三连--Docker是什么,为什么要使用Docker,如何使用Docker?)

    站在巨佬的肩膀上,才能看的更远!(没错这篇文章就是大量援引国内外网上各位大佬的博客,外加我这个小菜初入docker的一些理解,整理一下所学,也是为了方便我自己在暑假过完后,被别人问起docker问到我 ...

  4. 三、Python复习教程(重点)- 前端框架实战

    目录导航: 文章目录 目录导航: 五.Django商城项目开发(上) 1. 项目需求分析 ①. 项目开发流程 (1). 软件开发过程的划分 (2). 软件开发流程 (3). 软件开发过程域遵循的标准文 ...

  5. 重新理解 Go 实战

    点击上方蓝字关注我们 昨天很多人都看到我们GoCN社区和慕课网联合发布的<Go 高级程序员实战营>培训课程,看到内容的第一眼大家都很惊讶,为什么这个培训内容这么接地气,当然很多人纷纷私信我 ...

  6. AB-test理解与实战

    AB-test 1.定义:为同一个目标制定两个方案,在同一时间维度,分别让组成成分相同(相似)的用户群组随机的使用一个方案,收集各群组的用户体验数据和业务数据,最后根据显著性检验分析评估出较好的方案. ...

  7. Wide Deep模型的理解及实战(Tensorflow)

    目录 一.背景 二.概述 三.模型原理 3.1.Wide模型 3.2.Deep模型 3.3.Wide和Deep模型的协同训练 四.系统介绍 4.1.系统简介 4.2.系统流程 五.tensorflow ...

  8. 深入理解虚拟机实战:修改class文件实现System标准输出重定向

    一.背景 在深入理解Java虚拟机的过程中,理解java程序在虚拟机层次如何执行十分重要.了解了深层次的东西,才可以实现一般情况下做不到的特殊功能,而这种特殊功能面向的对象往往是程序员本身.下面我们通 ...

  9. PLSQL - Months_Between的理解和使用

    Months_Between是一个内置的日期操纵函数,用于计算两个日期相隔的月份数.Oracle文档的介绍如下: MONTHS_BETWEEN returns number of months bet ...

最新文章

  1. 使用嵌套的Repeater控件显示分级数据
  2. 记一次性能优化,单台4核8G机器支撑5万QPS
  3. VTK:平行坐标用法实战
  4. 【软件工程导论题型大总结】名词解释总结
  5. 计算机网络在城市轨道交通运营中的应用,开题报告-GIS在宁波城市轨道交通建设、管理与运营中的应用分析.doc...
  6. 某大型银行深化系统技术方案之十二:服务层之服务分类
  7. 浅析 路印协议--Loopring 及整体分析 Relay 源码
  8. Appium Desktop下载
  9. mysql如何清空数据库表内容
  10. Apache的安装教程
  11. 应用排行榜第一名脸萌只是刹那的烟火
  12. 远程连接服务器出现channel is not opened通道未打开
  13. Windows 10 截图工具
  14. java tapestry_java Tapestry4.1.2入门说明教程
  15. Vmware Ubuntu虚拟机提示:无法连接虚拟设备 sata0:1,因为主机上没有相对应的设备,解决办法
  16. Ryzen3 2200g安装Debian11.1后配置VBox
  17. (4.1.40.5)Android手势检测GestureDecetor详解
  18. php文件直链源码,蓝奏网盘文件夹直链解析源码
  19. Tableau表计算(1):计算类型
  20. Binary Cross Entropy

热门文章

  1. ajax 请求超过了5s 还没有返回 的话 就自动取消
  2. Oracle数据库命令行下数据的导入导出
  3. 005-对象——对象的 final const
  4. 【笔记】与Android选项卡一周
  5. 《JavaScript设计模式与开发实践》读书笔记之观察者模式
  6. ResourceLoader
  7. Mac下配置cocos2d-x开发环境(android和ios)
  8. 【Java基础】重写与重载
  9. java输出孪生素数对数_为什么孪生素数、波利尼亚克、哥德巴赫这些素数加减关系的猜想不能被证明?问题出在哪?...
  10. sudo mount -o loop pm.img /mnt/floppy/mount 错误解决办法--mount 您必须指定文件系统的类型