ORACLE HANDBOOK系列之三:PL/SQL中的集合类型(Collections in PL/SQL)

来源:Oracle认证    发布时间:2012-11-12    Oracle认证视频    评论

1 2 下一页

1)集合的分类

Oracle支持3种类型的集合:

关联数组(Associative array,即Index-by table)

嵌套表(Nested table)

变长数组(VARRAY)

它们的区别之一是, Nested table与VARRY既可以被用于PL/SQL,也可以被直接用于数据库中,但是Associative array不行,也就是说,Associative array是不能通过CREATE TYPE语句进行单独创建,只能在PL/SQL块(或Package)中进行定义并使用(即适用范围是PL/SQL Block级别),而Nested table与VARRAY则可以使用CREATE TYPE进行创建(即适用范围是Schema级别),它们还可以直接作为数据库表中列的类型。

BTW,为了避免误解,以下显式提到“索引”的地方,并非指的是数据库表的索引,而是特指访问集合元素时使用的“下标”,即Collection_Name(index)中的index。

2)集合类型的声明与初始化

2.1)Associative array

首先看一下Associative array的声明及初始化,示例中的第一部分显示,Associative array不能使用CREATE TYPE来创建。第二部分使用一个匿名PL/SQL块来演示Associative array使用,可以看到用法还是相对简单的。

Associative array的索引可以是稀疏的(即可以不连续)。

SQL> CREATE OR REPLACE TYPE ib_planguage IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;   /  Warning: Type created with compilation errors.  SQL> SHOW ERROR;  Errors for TYPE IB_PLANGUAGE:  LINE/COL ERROR  -------- -----------------------------------------------------------------  /0      PL/SQL: Compilation unit analysis terminated  /22     PLS-00355: use of pl/sql table not allowed in this context        DECLARE   TYPE ib_planguage IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;   lang ib_planguage;   idx PLS_INTEGER;  BEGIN   lang(1):='Java';   lang(9):='C#';   lang(3):='C++';   idx:=lang.FIRST;   WHILE(idx IS NOT NULL) LOOP      DBMS_OUTPUT.PUT_LINE(lang(idx));      idx:=lang.NEXT(idx);   END LOOP;  END;  SQL> /  java  c++  c#

2.2)Nested table

接着来看Nested table的声明及初始化,Nested table既可以通过CREATE TYPE声明成全局类型,也可以在PL/SQL块中声明块级别的类型。

与Associative array不同,Nested table变量需要显式初始化,其语法类似于C#,只是不用new关键字。额外地,Nested table初始化之后还需要调用EXTEND过程,扩展此集合的“容量”。

示例的第二部分提供了一种相对简单的初始化方法,即可以在构造器中直接传入集合成员。这种简便的初始化方法不适用于Associative array。

SQL> CREATE OR REPLACE TYPE nt_planguage IS TABLE OF VARCHAR2(10);   /  Type created.        DECLARE   lang nt_planguage;  BEGIN   lang:=nt_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;  SQL> /  java  c#  c++

或者可以简单地写成:

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

2.3)VARRAY

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

上一篇: ora2pg 9.1 发布,Oracle 转 PostgreSQL 工具
下一篇: Oracle 11g系列—1—基础回顾

1 2 下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答