技术开发 频道

Oracle学习:PL/SQL中的集合类型分析

   3.VARRAY

  最后我们来看VARRAY的声明及初始化,它与Nested table比较类似,但仍然存在一些区别,包括(1)VARRAY可以在声明时限制集合的长度,EXTEND的长度不能大于集合声明时的长度(下例中长度是8),但是在给集合成员赋值时,以EXTEND为准,例如下例中可以使用的只有3个集合成员。;(2)其索引总是连续的,而Nested table的索引在初始化赋值时是连续的,不过随着集合元素被删除,可能变得不连续。

SQL> CREATE OR REPLACE TYPE va_planguage IS VARRAY(8) OF VARCHAR2(10);
2 /
Type created.

DECLARE
lang va_planguage;
BEGIN
lang:
=va_planguage();
lang.EXTEND(
3);
lang(
1):='java';
lang(
2):='c#';
lang(
3):='c++';
FOR i IN 1..lang.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE(lang(i));
END LOOP;
END

   同样,也可以简单地写成:

DECLARE
lang va_planguage;
BEGIN
lang:
=va_planguage('java','c#','c++');
FOR i IN 1..lang.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE(lang(i));
END LOOP;
END;

    如何选择适用的集合类型

  通常来说,对集合类型的第一选择应该是Associative array,因为它不需要初始化或者EXTEND操作,并且是迄今为止最高效的集合类型。唯一不足的一点是它只能用于PL/SQL而不能直接用于数据库。

  如果你需要允许使用负数索引,应该选择Associative array;

  如果你需要使用10g,11g中的那些集合操作,应该选择Nested table;

  如果你需要限制集合元素的个数,应该选择VARRAY

  其它

  一个非常令人费解的地方是,位于PL/SQL语句块中的TYPE声明,必须使用关键字IS,而不能使用AS,但是在使用CREATE TYPE声明全局类型时,这两个是通用的。

  本来,说到这里就应该介绍完了,但是,Oracle引入了OO,导致我还要稍微说一下Object的声明及初始化,因为在某些情况下,你还会遇到集合成员是对象类型的情况。

SQL> CREATE OR REPLACE TYPE o_planguage IS OBJECT(lang VARCHAR2(10),lang_desc VARCHAR2(100));
2 /
Type created.

DECLARE
lang o_planguage;
BEGIN
lang:
=o_planguage('java','java is an OO programming language...');
DBMS_OUTPUT.PUT_LINE(lang.lang_desc);
END;

   注意,Object不能在PL/SQL语句块中声明。

  注意2,我们不能使用如下代码进行初始化:

  lang:=o_planguage();
  lang.lang:
=’java’;
  lang.lang_desc:
=’java is an OO programming language…’

  这样的语法会导致出现{PLS-00306: 调用 'lang' 时参数个数或类型错误},即Object类型没有默认的无参构造器。介绍完这个,那么即使集合的成员是Object时,也可以如法炮制去声明、初始化了。

0
相关文章