PL/SQL 嵌套表变长数组和索引表[转]
关于PL/SQL中这三种数组的介绍,不想写了。转一篇日志吧……
链接:http://www.blogjava.net/decode360/archive/2008/08/08/280825.html
作者:decode360
补充一点:假如从first到last的遍历过程中,存在被删除的占位符,如果使用则会报错。可用Exists(下标)的方法来判断是否存在。不能用is null 来判断……
记录类型不能整体用null判断,我能想到并测试成功的方法是判断里面的NOT NULL字段(推荐主键)是否为null。
TYPE nested_type IS TABLE OF VARCHAR2 ( 30 ) [not null];
-- 值为 varchar2 的数组,下标为默认 int ;
TYPE Calendar IS VARRAY ( 366 ) OF NUMBER ;
--366 个 number 数组,下标 1-366( 不是 0-365)
TYPE population_type IS TABLE OF NUMBER
INDEX BY VARCHAR2 ( 64 );
-- 下标是 varchar2 ,值是 number 的数组
DECLARE
TYPE wordlist IS TABLE OF VARCHAR2 ( 5 );
words wordlist;
BEGIN
words( 1 ) := 10 ; --COLLECTION_IS_NULL, 未赋空间
words := wordlist( 10 , 20 , 30 ); -- 进行赋值
words( 1 ) := 'yes' ; -- 正确
words( 2 ) := words( 1 ) || 'no' ; -- 正确
words( 3 ) := 'longer than 5 characters' ; --VALUE_ERROR ,字符过长
words( 'B' ) := 'dunno' ; --VALUE_ERROR ,下标错误
words( 4 ) := 'maybe' ; --SUBSCRIPT_BEYOND_COUNT ,下标超限
END ;
IF courses.EXISTS(i) THEN
courses(i) := new_course;
END IF ;
FOR i IN 1 .. courses.COUNT LOOP ...
注意:COUNT会忽略已经被删除的元素
IF (projects.COUNT + 15 ) < projects.LIMIT THEN ...
FOR i IN courses.FIRST .. courses.LAST LOOP ...
n := courses.PRIOR(courses.FIRST); --assigns NULL to n
courses.EXTEND( m , n ); --将第n个元素的值复制m份加到集合末端
courses.TRIM( 3 ); -- 与 extend 相反
courses.DELETE -- 删除全部
courses.DELETE( 2 ) -- 删除第 2 个元素
courses.DELETE( 2 , 5 ) -- 删除第 2 到第 5 个元素
COLLECTION_IS_NULL --- 调用一个空集合的方法 , 集合未被初始化
NO_DATA_FOUND --- 下标索引指向一个被删除的元素,或是关联数组中不存在的元素
SUBSCRIPT_BEYOND_COUNT --- 下标索引值超过集合中的元素个数
SUBSCRIPT_OUTSIDE_LIMIT --- 下标索引超过允许范围之外
VALUE_ERROR --- 下标索引值为空,或是不是指定的下标类型
FORALL i IN pnums.FIRST .. pnums.LAST
INSERT INTO partno VALUES (pnums(i)); ---注意:不用再Loop了
IF SQL % BULK_ROWCOUNT ( 3 ) = 0 THEN ...
表示如果第3次操作没有对数据影响的行数为0话……
注意%BULK_ROWCOUNT的值是可以大于1的,比如批量插入等
DECLARE
TYPE numlist IS TABLE OF NUMBER ;
num_tab numlist := numlist( 10 , 0 , 11 , 12 , 30 , 0 , 20 , 199 , 2 , 0 , 9 , 1 );
ERRORS NUMBER ;
dml_errors EXCEPTION ;
PRAGMA EXCEPTION_INIT (dml_errors, - 24381 );
BEGIN
FORALL i IN num_tab.FIRST .. num_tab.LAST SAVE EXCEPTIONS
DELETE FROM emp
WHERE sal > 500000 / num_tab(i);
EXCEPTION
WHEN dml_errors THEN
ERRORS := SQL %BULK_EXCEPTIONS.COUNT;
DBMS_OUTPUT.put_line( 'Number of errors is ' || ERRORS );
FOR i IN 1 .. ERRORS LOOP
DBMS_OUTPUT.put_line( 'Error '
|| i
|| ' occurred during '
|| 'iteration '
|| SQL % BULK_EXCEPTIONS (i).ERROR_INDEX);
DBMS_OUTPUT.put_line( 'Oracle error is '
|| SQLERRM (- SQL % BULK_EXCEPTIONS (i).ERROR_CODE));
END LOOP ;
END ;
PL/SQL 嵌套表变长数组和索引表[转]的更多相关文章
- PL/SQL — 变长数组
PL/SQL变长数组是PL/SQL集合数据类型中的一种,其使用方法与PL/SQL嵌套表大同小异,唯一的区别则是变长数组的元素的最大个数是有限制的.也即是说变长数组的下标固定下限等于1,上限可以扩展.下 ...
- oracle:变长数组varray,嵌套表,集合
创建变长数组类型 ) ); 这个变长数组最多可以容纳两个数据,数据的类型为 varchar2(50) 更改元素类型的大小或精度 可以更改变长数组类型和嵌套表类型 元素的大小. ALTER TYPE ...
- C++内存分配及变长数组的动态分配
//------------------------------------------------------------------------------------------------ 第 ...
- GCC 中零长数组与变长数组
前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...
- C99新特性:变长数组(VLA)
C99标准引入了变长数组,它允许使用变量定义数组各维.例如您可以使用下面的声明: ; ; double sales[rows][cols]; // 一个变长数组(VLA) 变长数组有一些限制,它必须是 ...
- c语言,变长数组
下面这个结构体,可以在malloc的时候指定数据data的长度,这样的形式就是变长数组:typedef struct{ int data_len; char data[0];//或char data[ ...
- C99中的变长数组(VLA)
处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...
- C语言变长数组 struct中char data[0]的用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...
- C语言变长数组data[0]总结
C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...
随机推荐
- 流形学习(manifold learning)的一些综述
流形学习(manifold learning)的一些综述 讨论与进展 issue 26 https://github.com/memect/hao/issues/26 Introduction htt ...
- PhoneGap + Dreamweaver 5.5 无法在模拟器中打开的问题(二)
转载:http://blog.csdn.net/dupang/article/details/8248335 按照网上的教程搭建Dreamweaver CS5.5+PhoneGap移动开发环境,在进行 ...
- rm加转义很危险
rm -r 想转义一个空格字符,转得不对 -r, -R, --recursive 递归删除目录及其内容 连续rm了n个不想rm的文件夹.%>_<% 想起来以前有人也因为rm的失误把整个wo ...
- [转载]# Ajax异步请求阻塞情况的解决办法
最近使用ExtJs4的mvc模式在开发了在线漫画的后台,因为异步请求比较多,有的回应时间长,有点短.我发现在多次并发的情况下,会造成阻塞的情况.也就是说如果回应时间长的请求还在进行中,短的请求却被挂起 ...
- Android 每天定时提醒功能实现
android要实现定时的功能那肯定就要用到闹铃相关的技术, 那么android闹铃实现是基于 AlarmManager 这个类的,首先我们来看一下它的几个主要的方法. 打开AlarmManager的 ...
- bzoj2821
其实和bzoj2724是一样的都是先处理多个块的答案,然后多余部分暴力空间要注意一下,还是O(nsqrt(n)); ..,..] of longint; g:..,..] of longint; a, ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- linux安装JDK TOMCAT
1.下载包 到http://apr.apache.org/下载下面3个包 apr-1.4.2.tar.gz apr-iconv-1.2.1.tar.gz apr-util-1.3.10.tar.gz ...
- 适配器模式 java
结构模式:将类和对象结合在一起构成更大的结构,就像是搭积木. 1.适配器模式 源接口---适配器--目标接口 2.使用场景: 现在你有一个很古老的类,里面的一些方法很有用,你如何使用这些方法? 当然你 ...
- 将cocos的app直接在我的设备上测试运行
首先,你要有一个写好了的,准备在真机上测试的cocos程序. 1.设置ARC,设置的过程在另外一篇博文上有写. 2.在Target的Build Setting里面 找到Valid Archs 删除里面 ...