技术开发 频道

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

  【IT168技术】文章一开始,先说说集合的分类,Oracle支持3种类型的集合:关联数组(Associative array,即Index-by table),嵌套表(Nested table)和变长数组(VARRAY)。

  相关阅读:

  Oracle学习:结构化查询实例演示与解析

  Oracle学习:批量SQL实例分析与比较

  三种集合分类的区别之一是, 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。

  集合类型的声明与初始化

  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;
2 /
Warning: Type created
with compilation errors.
SQL
> SHOW ERROR;
Errors
for TYPE IB_PLANGUAGE:
LINE
/COL ERROR
-------- -----------------------------------------------------------------
0/0      PL/SQL: Compilation unit analysis terminated
1/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.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);
2 /
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;
0
相关文章