PL/SQL中构造数组(orcal)

转载 2013年12月03日 17:22:32
原文出处:http://blog.sina.com.cn/s/blog_5eae21900100ptbf.html

最近在写PL/SQL中使用Oracle提供的索引表构造了一个二维数组。发现这里还包含了不少平时没有太关注的东西,简单总结一下。
 
 
在Oracle中很容易构造数组:
SQL> SET SERVEROUT ON SIZE 100000
SQL> DECLARE
  2   TYPE T_VARRAY IS VARRAY(5) OF NUMBER;
  3   V_VAR T_VARRAY := T_VARRAY(1,2,3,4,5);
  4  BEGIN
  5   FOR I IN 1..V_VAR.COUNT LOOP
  6    DBMS_OUTPUT.PUT_LINE(V_VAR(I));
  7   END LOOP;
  8  END;
  9  /
1
2
3
4
5

PL/SQL过程已成功完成。

对于二维数组也是很容易实现的:
SQL> DECLARE
  2   TYPE T_VARRAY IS VARRAY(5) OF NUMBER;
  3   TYPE T_VARRAY_VARRAY IS VARRAY(4) OF T_VARRAY;
  4   V_VAR T_VARRAY_VARRAY := T_VARRAY_VARRAY
  5    (
  6     T_VARRAY(1,2,3,4,5),
  7     T_VARRAY(1,2,3,4,5),
  8     T_VARRAY(1,2,3,4,5),
  9     T_VARRAY(1,2,3,4,5)
 10    );
 11  BEGIN
 12   FOR I IN 1..V_VAR.COUNT LOOP
 13    FOR J IN 1..V_VAR(I).COUNT LOOP
 14     DBMS_OUTPUT.PUT_LINE(V_VAR(I)(J));
 15    END LOOP;
 16   END LOOP;
 17  END;
 18  /
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5

PL/SQL过程已成功完成。

Oracle除了数组类型VARRAY之外,还有嵌套表和索引表也都可以实现类似数组的功能,其中索引表的使用更加灵活,方便。
SQL> DECLARE
  2   TYPE T_TAB IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  3   V_VAR T_TAB;
  4  BEGIN
  5   SELECT ROWNUM BULK COLLECT INTO V_VAR FROM USER_OBJECTS
  6   WHERE ROWNUM <= 5;
  7   FOR I IN 1..V_VAR.COUNT LOOP
  8    DBMS_OUTPUT.PUT_LINE(V_VAR(I));
  9   END LOOP;
 10  END;
 11  /
1
2
3
4
5

PL/SQL过程已成功完成。

使用索引表定义数组,不需要指定数组的上限,数组的大小只与内存限制有关。
而且索引组织表定义是指定的索引项并一定要是数值,举个简单的例子:
SQL> DECLARE
  2   TYPE T_TAB IS TABLE OF NUMBER INDEX BY VARCHAR2(30);
  3   V_VAR T_TAB;
  4   V_STR VARCHAR2(30);
  5  BEGIN
  6   FOR I IN (SELECT OWNER, COUNT(*) CN FROM DBA_TABLES GROUP BY OWNER) LOOP
  7    V_VAR(I.OWNER) := I.CN;
  8   END LOOP;
  9   V_STR := V_VAR.FIRST;
 10   WHILE (V_VAR.EXISTS(V_STR)) LOOP
 11    DBMS_OUTPUT.PUT_LINE(RPAD(V_STR, 20, ' ') || ':' || V_VAR(V_STR));
 12    V_STR := V_VAR.NEXT(V_STR);
 13   END LOOP;
 14  END;
 15  /
CATA_LOG            :37
CTXSYS              :37
DBSNMP              :21
DMSYS               :2
EXFSYS              :44
HR                  :7
IX                  :15
MDSYS               :49
OE                  :12
OLAPSYS             :126
ORDSYS              :4
OUTLN               :3
PM                  :2
SCOTT               :4
SH                  :17
SYS                 :706
SYSMAN              :337
SYSTEM              :141
TSMSYS              :1
WMSYS               :40
XDB                 :11
YANGTK              :6

PL/SQL过程已成功完成。

如果构造二维以上的数组,且维度不全是数值,那么就需要注意了:
SQL> DECLARE
  2   TYPE T_NUM_TAB IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  3   TYPE T_VAR_TAB IS TABLE OF NUMBER INDEX BY VARCHAR2(10);
  4   TYPE T_NUM_VAR IS TABLE OF T_NUM_TAB INDEX BY VARCHAR2(10);
  5   TYPE T_VAR_NUM IS TABLE OF T_VAR_TAB INDEX BY BINARY_INTEGER;
  6   V_NUM_VAR T_NUM_VAR;
  7   V_VAR_NUM T_VAR_NUM;
  8  BEGIN
  9   V_NUM_VAR(5)('A') := 1;
 10   V_VAR_NUM('A')(5) := 1;
 11  END;
 12  /
DECLARE
*
第1行出现错误:
ORA-06502: PL/SQL:数字或值错误: 字符到数值的转换错误
ORA-06512:在line 9


SQL> DECLARE
  2   TYPE T_NUM_TAB IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  3   TYPE T_VAR_TAB IS TABLE OF NUMBER INDEX BY VARCHAR2(10);
  4   TYPE T_NUM_VAR IS TABLE OF T_NUM_TAB INDEX BY VARCHAR2(10);
  5   TYPE T_VAR_NUM IS TABLE OF T_VAR_TAB INDEX BY BINARY_INTEGER;
  6   V_NUM_VAR T_NUM_VAR;
  7   V_VAR_NUM T_VAR_NUM;
  8  BEGIN
  9   V_NUM_VAR('A')(5) := 1;
 10   V_VAR_NUM('A')(5) := 1;
 11  END;
 12  /
DECLARE
*
第1行出现错误:
ORA-06502: PL/SQL:数字或值错误: 字符到数值的转换错误
ORA-06512:在line 10


SQL> DECLARE
  2   TYPE T_NUM_TAB IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  3   TYPE T_VAR_TAB IS TABLE OF NUMBER INDEX BY VARCHAR2(10);
  4   TYPE T_NUM_VAR IS TABLE OF T_NUM_TAB INDEX BY VARCHAR2(10);
  5   TYPE T_VAR_NUM IS TABLE OF T_VAR_TAB INDEX BY BINARY_INTEGER;
  6   V_NUM_VAR T_NUM_VAR;
  7   V_VAR_NUM T_VAR_NUM;
  8  BEGIN
  9   V_NUM_VAR('A')(5) := 1;
 10   V_VAR_NUM(5)('A') := 1;
 11  END;
 12  /

PL/SQL过程已成功完成。

从这个例子可以看出,用索引表构造的数组和C语言中的数组是有区别的。

只能在PL/SQL中访问联合数组。

  • 2012年02月29日 22:10
  • 13KB
  • 下载

使用Lua构造PL/SQL Developer插件框架

一、前言 Lua是一门脚本语言,由巴西里约热内卢天主教大学的一个研发小组创作,因其小巧和灵活备受青睐,魔兽世界和迅雷中都能看到它的身影,关于Lua更详细介绍和源代码,可以从http://www.lu...
  • mscf
  • mscf
  • 2011年09月03日 17:16
  • 2113

oracle学习之路(四) ---------PL/SQL 表,二维数组(TABLE)

LOB类型ORACLE提供了LOB (Large OBject)类型,用于存储大的数据对象的类型。ORACLE目前主要支持BFILE, BLOB, CLOB 及 NCLOB 类型。 NCLOB存储大...

PL/SQL记录和表(oracle type(数组))(最简单!文章下面标黄标题是精华,必看)

PL/SQL记录和表 1.使用%TYPE  (用于基本数据类型) 例1(用户并不知道Course_No的数据类型,只知道他是基于Student_No数据类型的,随着Student_No的类型变化而...
  • cph18
  • cph18
  • 2014年09月03日 16:54
  • 241

ORACLE(PL/SQL) 根据字符分割(SPLIT)字符串返回数组

ORACLE没有提供现成的函数来进行字符串的分割,网上有很多中现实方法,本文介绍一种我自己的实现方式。主要是使用Oracle内部函数instr和substr函数的方式来实现。...

PL/SQL记录和表(oracle type(数组))(最简单!文章下面标黄标题是精华,必看)

PL/SQL记录和表 1.使用%TYPE  (用于基本数据类型) 例1(用户并不知道Course_No的数据类型,只知道他是基于Student_No数据类型的,随着Student_No的类型变化而...

PL/SQL 集合 -- 关联数组

-- Start 关联数组(Associative Array)其实就是一个 MAP,键的类型可以是 VARCHAR2, VARCHAR, STRING, LONG 或 PLS_INTEGER。 D...

PL/SQL 联合数组与嵌套表

通常情况下,在PL/SQL中,处理单行单列的数据可以使用标量变量,而处理单行多列的数据则使用PL/SQL记录是不错的选择。单列多行数据 则由联合数组或嵌套表来完成,其特点是类似于单列数据库表。在Or...

PL/SQL变长数组

PL/SQL变长数组时PL/SQL集合数据类型中的一种,其使用方法与PL/SQL嵌套表大同小异,唯一的区别则是变长数组的元素的最大个数是有限 制的。也即是说变长数组的下标固定下限等于1,上限可以扩展...

如何从 PL/SQL 存储函数返回数组

简介  本文档演示如何从 PL/SQL 函数返回数组并从 java 应用程序访问它。数组是一组有序的数据元素。 VARRAY 是大小可变的数组。它具有数据元素的排列集,并且所有元素属于同一数据类...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PL/SQL中构造数组(orcal)
举报原因:
原因补充:

(最多只允许输入30个字)