当前位置: 首页 > 编程日记 > 正文

Oracle 11g Release 1 (11.1) PL/SQL_多维 Collection 类型和其异常

本文内容

  • 多维 Collection
  • Collection 异常

多维 Collection

虽然 collection 只有一维的,但可以模型一个多维的。创建一个 collection,其每个元素也是 collection 。例如,创建一个 varraynested table,一个 varrayvarray,一个 nested tablevarray 等。

示例1:演示多维 varray

DECLARE
  TYPE t1 IS VARRAY(10) OF INTEGER;
  TYPE nt1 IS VARRAY(10) OF t1; -- multilevel varray type
  va t1 := t1(2,3,5);
  -- initialize multilevel varray
  nva nt1 := nt1(va, t1(55,6,73), t1(2,4), va);
  i INTEGER;
  va1 t1;
BEGIN
  -- multilevel access
  i := nva(2)(3); -- i will get value 73
  DBMS_OUTPUT.PUT_LINE('I = ' || i);
  -- add a new varray element to nva
  nva.EXTEND;
  -- replace inner varray elements
  nva(5) := t1(56, 32);
  nva(4) := t1(45,43,67,43345);
  -- replace an inner integer element
  nva(4)(4) := 1; -- replaces 43345 with 1
  -- add a new element to the 4th varray element
  -- and store integer 89 into it.
  nva(4).EXTEND;
  nva(4)(5) := 89;
END;
/

示例2:演示多维 nested table

DECLARE
  TYPE tb1 IS TABLE OF VARCHAR2(20);
  TYPE Ntb1 IS TABLE OF tb1; -- table of table elements
  TYPE Tv1 IS VARRAY(10) OF INTEGER;
  TYPE ntb2 IS TABLE OF tv1; -- table of varray elements
  vtb1 tb1 := tb1('one', 'three');
  vntb1 ntb1 := ntb1(vtb1);
  vntb2 ntb2 := ntb2(tv1(3,5), tv1(5,7,3));
  -- table of varray elements
BEGIN
  vntb1.EXTEND;
  vntb1(2) := vntb1(1);
  -- delete the first element in vntb1
  vntb1.DELETE(1);
  -- delete the first string
  -- from the second table in the nested table
  vntb1(2).DELETE(1);
END;
/

示例3:演示多维 associative array

DECLARE
  TYPE tb1 IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
  -- the following is index-by table of index-by tables
  TYPE ntb1 IS TABLE OF tb1 INDEX BY PLS_INTEGER;
  TYPE va1 IS VARRAY(10) OF VARCHAR2(20);
  -- the following is index-by table of varray elements
  TYPE ntb2 IS TABLE OF va1 INDEX BY PLS_INTEGER;
  v1 va1 := va1('hello', 'world');
  v2 ntb1;
  v3 ntb2;
  v4 tb1;
  v5 tb1; -- empty table
BEGIN
  v4(1) := 34;
  v4(2) := 46456;
  v4(456) := 343;
  v2(23) := v4;
  v3(34) := va1(33, 456, 656, 343);
  -- assign an empty table to v2(35) and try again
  v2(35) := v5;
  v2(35)(2) := 78; -- it works now
END;
/

Collection 异常

示例 4:演示 Collection 异常

演示各种 PL/SQL 预定义的 collection  异常,备注的部分说明如何避免这些异常。

DECLARE
  TYPE WordList IS TABLE OF VARCHAR2(5);
  words WordList;
  err_msg VARCHAR2(100);
  PROCEDURE display_error IS
  BEGIN
    err_msg := SUBSTR(SQLERRM, 1, 100);
    DBMS_OUTPUT.PUT_LINE('Error message = ' || err_msg);
  END;
BEGIN
  BEGIN
    words(1) := 10; -- Raises COLLECTION_IS_NULL
--  A constructor has not been used yet.
--  Note: This exception applies to varrays and nested tables,
--  but not to associative arrays which do not need a constructor.
    EXCEPTION
      WHEN OTHERS THEN display_error;
  END;
--  After using a constructor, you can assign values to the elements.
    words := WordList('1st', '2nd', '3rd'); -- 3 elements created
--  Any expression that returns a VARCHAR2(5) is valid.
    words(3) := words(1) || '+2';
  BEGIN
    words(3) := 'longer than 5 characters'; -- Raises VALUE_ERROR
--  The assigned value is too long.
    EXCEPTION
      WHEN OTHERS THEN display_error;
  END;
  BEGIN
    words('B') := 'dunno'; -- Raises VALUE_ERROR
--  The subscript (B) of a nested table must be an integer. 
--  Note: Also, NULL is not allowed as a subscript.
    EXCEPTION
      WHEN OTHERS THEN display_error;
  END;
  BEGIN
    words(0) := 'zero'; -- Raises SUBSCRIPT_OUTSIDE_LIMIT 
--  Subscript 0 is outside the allowed subscript range.
    EXCEPTION
      WHEN OTHERS THEN display_error;
  END;
  BEGIN
    words(4) := 'maybe'; -- Raises SUBSCRIPT_BEYOND_COUNT
--  The subscript (4) exceeds the number of elements in the table.
--  To add new elements, invoke the EXTEND method first.
    EXCEPTION
      WHEN OTHERS THEN display_error;
  END;
  BEGIN
    words.DELETE(1);
    IF words(1) = 'First' THEN NULL; END IF;
      -- Raises NO_DATA_FOUND
--  The element with subcript (1) was deleted.
    EXCEPTION
      WHEN OTHERS THEN display_error;
  END;
END;
/

在子块处理产生的异常,执行就会继续。下面是一些异常:

Collection 异常当……产生……

COLLECTION_IS_NULL

尝试操作一个自动为 null 的 collection

NO_DATA_FOUND

一个标值指定了一个被删除的元素,或一个 associative array 不存在的元素

SUBSCRIPT_BEYOND_COUNT

一个标值超过了一个 collection 元素的数量

SUBSCRIPT_OUTSIDE_LIMIT

一个标值超出了被允许的范围

VALUE_ERROR

一个标值为 null 或不能转换成键的类型。若键被定义为 PLS_INTEGER,或标值超出范围,则会产生该异常

在多数情况下,你可以传递一个不可靠的标值给方法,而不会产生异常。例如,当你传递一个 null 给 DELETE(n) 时,该方法什么都不会做。给已经删除的元素赋值,来替换这个已删除的元素,不会产生 NO_DATA_FOUND 异常。

示例 5:演示 DELETE(n) 如何处理不可靠的标值

DECLARE
   TYPE NumList IS TABLE OF NUMBER;
   nums NumList := NumList(10,20,30);  -- initialize table
BEGIN
   nums.DELETE(-1);  -- does not raise SUBSCRIPT_OUTSIDE_LIMIT
   nums.DELETE(3);   -- delete 3rd element
   DBMS_OUTPUT.PUT_LINE(nums.COUNT);  -- prints 2
   nums(3) := 30;    -- allowed; does not raise NO_DATA_FOUND
   DBMS_OUTPUT.PUT_LINE(nums.COUNT);  -- prints 3
END;
/

示例 6:演示包和本地 Collection 之间不兼容性

包的 collection 类型与本地 collection 类型不兼容。例如,若你调用包的存储过程,如下所示,第二个存储过程会调用失败,因为,包的和本地的 varray 类型不兼容,尽管它们具有相同的定义。

CREATE PACKAGE pkg AS
   TYPE NumList IS TABLE OF NUMBER;
   PROCEDURE print_numlist (nums NumList);
END pkg;
/
CREATE PACKAGE BODY pkg AS
  PROCEDURE print_numlist (nums NumList) IS
  BEGIN
    FOR i IN nums.FIRST..nums.LAST LOOP
      DBMS_OUTPUT.PUT_LINE(nums(i));
    END LOOP;
  END;
END pkg;
/
 
DECLARE
   TYPE NumList IS TABLE OF NUMBER;
   n1 pkg.NumList := pkg.NumList(2,4); -- type from the package.
   n2 NumList := NumList(6,8);         -- local type.
BEGIN
   pkg.print_numlist(n1); -- type from pkg is legal
-- The packaged procedure cannot accept
-- a value of the local type (n2)
-- pkg.print_numlist(n2);  -- Causes a compilation error.
END;
/

o_r_%E7%BF%BB%E8%AF%91.jpg

相关文章:

入门系列之使用fail2ban防御SSH服务器的暴力破解攻击

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文由SQL GM 发表于云社区专栏 介绍 对于SSH服务的常见的攻击就是暴力破解攻击——远程攻击者通过不同的密码来无限次地进行登录尝试。当然SSH可以设置使用非密码验证验证方式来对抗这种攻击,例…

谁能解答我对知识图谱的上百个疑问?

近日,我们采访了东南大学认知智能研究所所长漆桂林教授和复旦大学知识工场实验室负责人肖仰华教授,围绕知识图谱这两年在研究与产业应用道路上的一些进展与仍面临的问题。漆桂林教授提到,近两年,知识图谱的研究在四大关键技术上都…

ecshop 商品颜色尺寸仿淘宝选择功能教程(2.7.0版本)

牵涉到的修改文件(default模板为例) /themes/default/style.css /themes/default/goods.dwt 注:此路径待修改模板路径.修改步骤:一:控制样式 1.打开/themes/ecshop/p_w_picpaths 加添图片test.gif. 2.打开/themes/ecshop/style.css 最下面添加: /*--------------颜色选择器CSS添…

【C++】Effective STL:50条有效使用STL的经验

第一条:慎重选择容器类型 1、C容器:先混个眼熟 序列容器:array、vector、string、deque、list、forward_list 有序关联容器:set、map、multiset、multimap 无序关联容器:unordered_set、unordered_map、unordered_mu…

ICML 2019接受论文:清华、北大领跑,谷歌强压枝头,BAT略显“低调”

整理 | 刘畅责编 | Jane、Rachel出品 | AI科技大本营(id:rgznai100)【AI科技大本营导语】今年 6 月,机器学习领域顶会 ICML 2019 将在美国举行。为了帮助大家更好了解会议论文的情况,博世(Bosch&#xff09…

C++STL 优先队列priority_queue使用

头文件&#xff1a;#include <queue> 一.申明方式 std::priority_queue<T> q; std::priority_queue<T, std::vector<T>, cmp> q;1.普通方法&#xff1a; priority_queue<int> q; //大的优先级高 priority_queue<int,vector<int>, …

【SVN】linux下svn命令参数详解(二)

svn全部子命令详解1、svn help2、svn add3、svn blame4、svn cat5、svn changelist6、svn checkout7、svn cleanup8、svn commit9、svn copy10、svn delete11、svn diff12、svn export13、svn help14、svn import15、svn info16、svn list17、svn lock18、svn log19、svn merge…

VClient 无法连接Vcenter

前一段在一台windows server 2008 R2上使用local Administrator 安装了VCenter 4.1. 一开始使用VClient 是可以登录的&#xff0c;但是重新启动这台安装有VCenter 的Server 之后就连接不到了。为什么呢&#xff1f; 打开这台Windows Server 2008 查看服务发现SQL 和 VM 都有服务…

智能音箱玩出新花样?这家公司推出2699元的智能虚拟机器人

家居控制、备忘提醒、媒体播放、智能聊天… …如今&#xff0c;AI 应用备受瞩目&#xff0c;智能虚拟机器人也成为了 AI 应用的新方向。 5 月 20 日下午&#xff0c;专注于虚拟机器人研发、平台软件开发运用及销售为一体的公司欧博思发布了 AI BOX 智能虚拟机器人产品。 乍一…

干货 :数据可视化的10个关键术语

2019独角兽企业重金招聘Python工程师标准>>> Format 交互方式 交互式可视化允许您修改&#xff0c;操作和探索计算机显示的数据。绝大多数交互式可视化系统在计算机网络上&#xff0c;但越来越多出现在平板电脑和智能手机上。相比之下&#xff0c;静态可视化只显示单…

【设计模式】三大类:创建型模式、结构型模式、行为型模式

1 创建型模式 本人理解&#xff1a;以C为例&#xff0c;创建对象时&#xff0c;用关键字new来创建&#xff08;实例化&#xff09;对象。用一个函数或类将new的过程封装起来&#xff0c;就是创建型模式。 《设计模式》中的描述&#xff1a; 创建型模式抽象了实例化过程。它们…

单机训练速度提升高达640倍,快手开发GPU广告模型训练平台

作者&#xff5c;廉相如&#xff08;快手FeDA智能决策实验室 &#xff09;如何有效处理大规模用户数据进行广告推荐&#xff1f;对于互联网企业的发展和进步至关重要。这也是为何快手成立西雅图实验室并实现新一代GPU广告模型训练平台的原因之一。快手新创建的“Persia”GPU广告…

比特币SPV节点启动流程图

2019独角兽企业重金招聘Python工程师标准>>> 比特币SPV节点启动流程图 图小点击右键在新窗口打开 转载于:https://my.oschina.net/penghaozhong/blog/1924687

Android中后台定时任务实现,即时数据同步问题思考!

为什么80%的码农都做不了架构师&#xff1f;>>> 如果你正在找Android后台定时任务实现,那么你找对了,但是其实如果你正在找Java后台任务实现,你就不会找到我的这个博客了.但是我的实现方式没有使用多少Android相关的东西.确实.但是如果你进来了,Thank you!你还是会…

面对996,程序员如何利用“碎片时间”涨薪?

图片来源|视觉中国作为一个程序员&#xff0c;需要不断学习更新知识技能来提升自己。但爆炸式的信息量&#xff0c;总使人抓不到学习重点。所以&#xff0c;笔者为大家筛选了几个程序员会阅读的小众公众号&#xff0c;覆盖全面&#xff0c;囊括了不同的技术类别。小道消息&…

JakartaEE Exception: Invalid bound statement (not found): com.mazaiting.blog.dao.UserDao.selectUs...

异常 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mazaiting.blog.dao.UserDao.selectUserByNameat org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:227) ~[mybatis-3.4.6.jar:3.4.6]at org.a…

【Qt】AVFrame转QImage

FFmpeg的AVFrame转成Qt的QImage //头文件 #ifdef __cplusplus extern "C" {#endif #include <libavcodec/avcodec.h> #include <libavcodec/avformat.h>

C# 回发或回调参数无效

回发或回调参数无效。在配置中使用 <pages enableEventValidation"true"/> 或在页面中使用<% Page EnableEventValidation"true" %> 启用了事件验证。出于安全目的&#xff0c;此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务…

【QT】Qt正则表达式的使用:使用QRegExp来限制QLineEdit的输入格式

QLineEdit中使用QRegExp来限制输入格式,下面以IP输入框为例 QLineEdit *lineEditIP = new QLineEdit("192.168.147.200", this);QRegExpValidator *reg = new QRegExpValidator(GW::RegExp::ipRegExp(), this)

小小的Python编程故事

现在Python的火热已经不是整个编程界的事情了&#xff0c;Python的火热已经蔓延到小学、大学课程&#xff0c;之前看新闻报道说青岛的小学生课程里都开始设置Python的课程了&#xff0c;大学里由原来必考的VB也改成了Python。一时大家都掀起了学习了Python的热潮&#xff0c;而…

python 验证码识别示例(二) 复杂验证码识别

在这篇博文中手把手教你如何去分割验证&#xff0c;然后进行识别。 一&#xff1a;下载验证码 验证码分析&#xff0c;图片上有折线&#xff0c;验证码有数字&#xff0c;有英文字母大小写&#xff0c;分类的时候需要更多的样本&#xff0c;验证码的字母是彩色的&#xff0c;图…

★核心关注点_《信息系统项目管理师考试考点分析与真题详解》

★核心关注点_《信息系统项目管理师考试考点分析与真题详解》真诚感谢你选用《信息系统项目管理师考试考点分析与真题详解》作为高级项管的辅导用书。对于使用该书的读者们&#xff0c;在备考2012.5.26信息系统项目管理师考试之下午案例分析和论文写作考试时&#xff0c;以下一…

告别低分辨率网络,微软提出高分辨率深度神经网络HRNet | CVPR 2019

来源 | 微软研究院AI头条&#xff08;ID&#xff1a;MSRAsia&#xff09;作者简介&#xff1a;孙可&#xff0c;中国科学技术大学信息学院在读博士生&#xff0c;目前在微软亚洲研究院视觉计算组实习&#xff0c;导师是王井东和肖斌老师。他的研究兴趣包括人体姿态估计、语义分…

sudo提权实战讲解 对用户对组的权限配置分析

Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要&#xff0c;再来提升权限执行。 sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码&#xff0c;就可以…

【Qt】在Ubuntu16.04中安装QSerialPort模块

1、问题描述 在pro中添加&#xff1a;QT serialport 编译时报错&#xff1a;Project ERROR Unknown module(s) in QT:serialport 2、解决方法 安装QSerialPort模块库 sudo apt-get install libqt5serialport5-dev

Velocity文档(3)

2019独角兽企业重金招聘Python工程师标准>>> velocity.properties 的一些配置项 velocimcro.library属性&#xff1a;指定自己的模板库&#xff0c;多个模板库以逗号分隔。默认情况下&#xff0c;velocity查找唯一的一个库&#xff1a;VM_global_library.vmvelocima…

Java 24岁!Google加持的Kotlin真能取代它?

作者 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;1995 年 5 月 23 日&#xff0c;Sun 公司在 Sun world 会议上正式宣布了 Java 的到来&#xff0c;从此一代编程语言界的翘楚就此诞生。而在不断地迭代与适配中&#xff0c;今时今日&#xff0c;Java 以需…

三,ES6中需要注意的特性(重要)

-----书接上文&#xff0c;前文中我们总结了关于JS的组成部分以及如何快速开展学习JS&#xff0c;相信已经有很多朋友掌握到这些方法。接下来就从更深的ECMAScript开始说起。 1.什么是ES6? ECMAScript(European Computer Manufacturers Association) 6: 是JavaScript语言的下一…

【SVN】在阿里云上创建svn服务器

1、创建用户及相关设置 阿里云搭建ubuntu18.04工作台&#xff0c;默认只有root超级用户。为了安全起见&#xff0c;我们使用普通用户来创建svn&#xff1a; useradd hello // 创建用户hello mkdir -p /home/hello // 在hello用户的根目录 cd /home/hello chown hello . // 设…

【转】on delete cascade

关系表的级联更新&#xff1a; on update cascade on delete cascade 是级联删除的意思 意思是 当你更新或删除主键表时&#xff0c;那么外键表也会跟随一起更新或删除 CREATE TABLE Countries(CountryId INT PRIMARY KEY) INSERT INTO Countries (CountryId) VALUES (1) INSER…