`

PL/SQL三种集合类型的比较

阅读更多

PL/SQL三种集合类型的比较

       集合是指在一个程序变量中包含多个值。PL/SQL提供的集合类型如下:

Associative Array:

TYPE t IS TABLE OF something INDEX BY PLS_INTEGER;

Nested Table:

TYPE t IS TABLE OF something;

VARRAY:

TYPE t IS VARRAY (123) OF something;

三种集合的各自使用范围

       前提是在PL/SQL中希望某种类型的多个值,并且希望使用myarray[n]的形式访问。

范围:SQL or PL/SQL

       最大的区别是首先需要确定使用范围,SQLPL/SQL时两种不同的语言。PL/SQLSQL的过程性语言。Associative Arrays仅存在于PL/SQL中。因此:

       ·只能在PL/SQL中使用的是:Associative Array

       ·可以在SQL中使用:Nested Table, VARRAY

       同时需要注意的是:在SQL中创建一个类型和PL/SQL中声明一个类型是不同的。

SQL中创建的集合类型

       集合是SQL的一部分,不需要到PL/SQL中就可以使用它们:

       CREATE TYPE VARCHAR2_TT AS TABLE OF VARCHAR2(100)

/

SELECT column_value AS val

FROM   TABLE(VARCHAR2_TT('Apple','Banana','Apricot'))

WHERE  column_value NOT LIKE 'A%';

 

VAL

--------------------

Banana

在以上的例子中,我们创建了一个集合类型,并在查询中使用,完全在SQL中。这种形式创建的类型可以在任何查询和PL/SQL程序中使用。其他用户使用需要GRANT EXECUTE ON type_name TO other_account授权。

PL/SQL中声明的集合类型

       PL/SQL中,可以使用SQL中创建的集合类型,或者本地声明自己的类型。在PL/SQL中声明可以更加灵活的自定义包中专用的类型,允许声明他们使用%TYPE%ROWTYPE引用特定的表的列,如TABLE OF emp.empno%TYPE。不过这仅仅是PL/SQL中的特征,不能在SQL中使用,甚至可以定义自己的类型,然后生命那种类型的集合。如下:

DECLARE

    TYPE stats_rec IS RECORD

    ( batch_step      batch_log.step_name%TYPE

    , elapsed_time    INTERVAL DAY(0) TO SECOND(0)

    , rows_processed  PLS_INTEGER );

 

    TYPE stats_tt IS TABLE OF stats_rec; -- a locally-defined nested table collection type

由于仅在PL/SQL中使用, SQL并不知道:

CREATE OR REPLACE PACKAGE testtypes AS

    TYPE varchar2_tt IS TABLE OF VARCHAR2(100);

END testtypes;

/

 

Package created.

 

SELECT column_value AS val

FROM   TABLE(testtypes.VARCHAR2_TT('Apple','Banana','Apricot'))

WHERE  column_value NOT LIKE 'A%';

 

FROM   TABLE(testtypes.VARCHAR2_TT('Apple','Banana','Apricot'))

       *

ERROR at line 2:

ORA-22905: cannot access rows from a non-nested table item

可以使用以下查询查看所有类型:

SELECT ct.owner, ct.type_name, ct.elem_type_name, ct.length

FROM   all_coll_types ct

     , all_types ot

WHERE  ct.coll_type = 'TABLE'

AND    ot.type_name(+) = ct.elem_type_name

AND    ot.owner(+) = ct.elem_type_owner

AND    ot.type_name IS NULL

ORDER BY ct.owner, ct.type_name;

Associative Arrays特征

       如果在PL/SQL中只需要声明和填充,那么关联数组将是一种方便的方法。不需要独立的CREATE OR REPLACE TYPE,不需要初始化,不需要扩展,可以随意的放入各种值,如下:

DECLARE

    TYPE number_index_by_string IS TABLE OF NUMBER INDEX BY VARCHAR2(30);

    TYPE string_index_by_number IS TABLE OF dept.loc%TYPE INDEX BY PLS_INTEGER;

 

    v_country_codes  NUMBER_INDEX_BY_STRING;

    v_countries      STRING_INDEX_BY_NUMBER;

BEGIN

    v_country_codes('Ukraine') := 380;

    v_country_codes('UAE')     := 971;

    v_country_codes('UK')      := 44;

    v_country_codes('USA')     := 1;

 

    v_countries(380)  := 'Ukraine';

    v_countries(971)  := 'UAE';

    v_countries(44)   := 'UK';

    v_countries(1)    := 'USA';

END;

       需要注意的是,在number_index_by_string中使用了INDEX BY VARCHAR2(30),这使我们通过v_country_codes('UK')引用数组的UK元素。这是数组的唯一特征。关联数组没有构造体。也就是不能使用myarray := mytype(2,4,6,37)进行一次性填充四个值。

PL/SQL集合类型相对于SQL集合类型

       可以在PL/SQL中声明任何类型。

       主要区别如下:

范围

意义

集合类型

PL/SQL

只能在PL/SQL中声明,没有"CREATE OR REPLACE TYPE". SQL 中不能使用。

不需要初始化和扩展,只需要分配值给特定的元素,甚至不需要元素顺序。

可以选择"index by" - PLS_INTEGER, BINARY_INTEGER VARCHAR2.

没有构造体,必须显示分配值。不能在查询中作为一个表处理,如SELECT * FROM TABLE(myarray)

 

 

Associative Array

SQL ,PL/SQL

可以在PL/SQL中声明或者使用"CREATE OR REPLACE TYPE"

使用前必须初始化:myarray mytype := mytype();

具有构造体,可以使用mytype('x','y','z');分配值;

必须进行扩展以增加元素,myarray.EXTEND;

在查询中可以作为表处理SELECT * FROM TABLE(myarray) (如果使用CREATE TYPE创建).

 

 

Nested Table

VARRAY

VARRAYs的缺点

       可以看到,VARRAYsNested Tables的描述基本相同,并且两种类型都可以在SQLPL/SQLTABLE()中使用。VARRAYs的一些不具有的特征在nested table中可以使用的包括:

       ·集合函数,如CARDINALITYCOLLECTPOWERMULTISET,等;

       ·多重集条件,如IS A SET, MEMBER OFSUBMULTISET

       ·多重集操作符,如MULTISET INTERSECT

       如:

DECLARE

    my_array VARCHAR2_TT :=

        VARCHAR2_TT('Apple','Apple','Orange','Banana');

BEGIN

    IF my_array IS A SET THEN

        DBMS_OUTPUT.PUT_LINE('No duplicates found');

    ELSE

        DBMS_OUTPUT.PUT_LINE('Collection contains duplicates');

    END IF;

END;

 

Collection contains duplicates

再如:

DECLARE

    my_array VARCHAR2_TT :=

        VARCHAR2_TT('Apple','Apple','Orange','Banana');

BEGIN

    IF 'Orange' MEMBER OF my_array THEN

        DBMS_OUTPUT.PUT_LINE('"Orange" exists in the collection');

    ELSE

        DBMS_OUTPUT.PUT_LINE('"Orange" does not exist in the collection');

    END IF;

END;

 

"Orange" exists in the collection

 

 

DECLARE

    my_array1 VARCHAR2_TT :=

        VARCHAR2_TT('Apple','Orange','Cherry','Banana');

 

    my_array2 VARCHAR2_TT :=

        VARCHAR2_TT('Orange','Kumquat','Grape','Banana');

 

    my_array3 VARCHAR2_TT := my_array1 MULTISET INTERSECT my_array2;

BEGIN

    FOR i IN my_array3.FIRST..my_array3.LAST LOOP

        DBMS_OUTPUT.PUT_LINE(my_array3(i));

    END LOOP;

END;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    精通Oracle 10g SQL和PL/SQL

    集合类型 对象类型等  本书不仅适合于pl/sql初学者 而且也适合于有经验的pl/sql编程人员 本书还可以作为oracle应用开发培训班的教材或者辅助材料 ">sql是关系数据库的基本操作语言 它是应用程序与数据库进行交互...

    PL/SQL 用户指南与参考

    第五章 PL/SQL集合与记录 第六章 PL/SQL与Oracle间交互 第七章 控制PL/SQL错误 第八章 PL/SQL子程序 第九章 PL/SQL包 第十章 PL/SQL对象类型 第十一章 本地动态SQL 第十二章 PL/SQL应用程序性能调优

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    PL/SQL Developer 6.05注册版-1

    <br>工具——PL/SQL Developer为简化日常开发专门提供了几种工具。使用这些工具,您可以重新编译全部不合法对象、查找数据库源中文本、导入或导出表格、生成测试数据、导出文本文件、监控dbms_alert和dbms_pipe...

    Oracle PL SQL程序设计 上 第五版(代码示例)

    《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

    PL/SQL Developer v8.0.zip

    工具——PL/SQL Developer为简化日常开发专门提供了几种工具。使用这些工具,您可以重新编译全部不合法对象、查找数据库源中文本、导入或导出表格、生成测试数据、导出文本文件、监控dbms_alert和dbms_pipe事件、...

    PL/SQL Developer 7.1.5 注册版-3

    <br>工具——PL/SQL Developer为简化日常开发专门提供了几种工具。使用这些工具,您可以重新编译全部不合法对象、查找数据库源中文本、导入或导出表格、生成测试数据、导出文本文件、监控dbms_alert和dbms_pipe...

    精通Oracle 10g PL/SQL编程

    通过学习本书,读者不仅可以掌握PL/SQL的基础编程知识(嵌入SQL语句和编写子程序),而且还可以掌握PL/SQL的所有高级开发特征(使用记录类型、集合类型、对象类型和大对象类型)。另外,本书还为应用开发人员提供了大量...

    PL/SQL经典介绍

    第五章 PL-SQL集合与记录(1) 第六章 PL-SQL集合与记录(2) 第七章 PL-SQL与Oracle间交互 第八章 控制PL-SQL错误 第九章 PL-SQL子程序 第十章 PL-SQL包 第十一章 PL-SQL对象类型 第十二章 本地动态SQL 第十三章 PL...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

    通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的...pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)...

    Oracle PL/SQL程序设计(第5版)(下册) 第一部分

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

    通过学习本书,读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的...PL/SQL的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)...

    PL/SQL Developer

     工具——PL/SQL Developer为简化日常开发专门提供了几种工具。使用这些工具,您可以重新编译全部不合法对象、查找数据库源中文本、导入或导出表格、生成测试数据、导出文本文件、监控dbms_alert和dbms_pipe事件、...

    Oracle PL/SQL语言初级教程

    PL/SQL集合 23 嵌套表 24 使用集合 25 集合的方法 28 关于集合之间的比较 29 3.PL/SQL单行函数和组函数详解 29 单行字符串函数 30 单行转换函数 37 SQL中的组函数 40 嵌套函数 42 4.Oracle数据库数据对象分析(上)...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

    通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的...pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)...

    pl/sql developer 9 + 注册机

     PL/SQL Developer为简化日常开发专门提供了几种工具。使用这些工具,您可以重新编译全部不合法对象、查找数据库源中文本、导入或导出表格、生成测试数据、导出文本文件、监控dbms_alert和dbms_pipe事件、浏览会话...

    PL/SQL Developer8.04官网程序_keygen_汉化

     2) 循环结构 这一结构与其他语言不太一样,在PL/SQL程序中有三种循环结构: a. loop … end loop;b. while condition loop … end loop;c. for variable in low_bound . . upper_bound loop … end loop;其中的...

    PL/SQL学习笔记

    PL/SQL有三种集合 联合数组 嵌套表 可变数组 联合数组详解: 什么是数组?数组有什么特点 数据是线性存放的,在内存中地址是连续的 可以用索引来访问 定义联合数组? 联合数组不需要定义长度,他能容纳的元素最大...

Global site tag (gtag.js) - Google Analytics