`

PL/SQL 数组

阅读更多
PLSQL学习(二) 数组专题

    PLSQL中提供了三种数据的形式,功能还是比较强大的。但是总的来说,PLSQL中的数组知识掌握最简单的那种,其他大致了解就可以了。因为从实际应用的角度来说,在PLSQL中用到数组的几率不是很大。这主要是由于PLSQL跟数据库的紧密结合特性所决定的,数据库的表可以很轻易得实现基本的数组功能。当然这是我个人的一点理解,不一定正确。下面是详细介绍


1、PLSQL中的数组共分三类:

I  - 嵌套表(Nested tables)
TYPE nested_type IS TABLE OF VARCHAR2 ( 30 ) [not null];

-- 值为 varchar2 的数组,下标为默认 int ;

特征:可删除信息,下标不变

II - 变长数组(Variable-Sized Arrays)
TYPE Calendar IS VARRAY ( 366 ) OF NUMBER ;

--366 个 number 数组,下标 1-366( 不是 0-365)

特征:一般在可预知数组个数的情况下使用,类似其他语言的Array

III- 索引表(Associative Array)

TYPE population_type IS TABLE OF NUMBER

INDEX BY VARCHAR2 ( 64 );

-- 下标是 varchar2 ,值是 number 的数组

特征:可使用不连续数字、负数、字符作为下标,长度大小可变
      在创建数组时便分配内存,无需之后申请
      index by 只能跟BINARY_INTEGER、PLS_INTEGER、VARCHAR2三种类型


2、数组中的赋值错误问题:


DECLARE

  TYPE wordlist IS TABLE OF VARCHAR2 ( 5 );

  words wordlist;

BEGIN

  words( 1 )      := 10 ; --COLLECTION_IS_NULL, 未赋空间

  words         := wordlist( 10 , 20 , 30 ); -- 进行赋值

  words( 1 )      := 'yes' ; -- 正确

  words( 2 )      := words( 1 ) || 'no' ; -- 正确

  words( 3 )      := 'longer than 5 characters' ; --VALUE_ERROR ,字符过长

  words( 'B' )    := 'dunno' ; --VALUE_ERROR ,下标错误

  words( 4 )      := 'maybe' ; --SUBSCRIPT_BEYOND_COUNT ,下标超限

END ;


在声明 words wordlist; 之后数组未初始化,完全没有用处
必须进行初始化,如:
words := wordlist( 10 , 20 , 30 );--定值初始化;
words := wordlist();--空值初始化,任何数组必须先初始化;
words.extend(n);--末尾增加N位空间,不加N则为默认增加1位;
然后可以赋值


3、数组相关集合函数:
 
1、EXISTS(判断第i位是否存在)
IF courses.EXISTS(i) THEN

  courses(i)    := new_course;

END IF ;



2、COUNT(数组中的元素个数)
FOR i IN 1 .. courses.COUNT LOOP ...

注意:COUNT会忽略已经被删除的元素



3、LIMIT(集合的最大容量)
IF (projects.COUNT + 15 ) < projects.LIMIT THEN ...

注意:LIMIT一般只对变长数组有效(其他两类均返回NULL)

4、FIRST和LAST(第一个和最后一个元素的下标)
FOR i IN courses.FIRST .. courses.LAST LOOP ...

注意:返回值是下标,而不是值!在遍历元素时,FIRST和LAST都会忽略被删除的元素

5、PRIOR和NEXT(返回索引为n的前驱/后驱下标)
n := courses.PRIOR(courses.FIRST);  --assigns NULL to n

注意:返回值是下标,而不是值!在遍历元素时,FIRST和LAST都会忽略被删除的元素

6、EXTEND(扩大集合容量)
courses.EXTEND( m , n ); --将第n个元素的值复制m份加到集合末端

注意:m默认为1,n默认为null,m包含被删除元素

7、TRIM(缩减集合容量)
courses.TRIM( 3 ); -- 与 extend 相反


8、DELETE(删除集合元素)
courses.DELETE      -- 删除全部

courses.DELETE( 2 )   -- 删除第 2 个元素

courses.DELETE( 2 , 5 ) -- 删除第 2 到第 5 个元素

注意:使用delete的时候必须要结合3中数组的不同特征!


4、Exception的类型及原因:

COLLECTION_IS_NULL         --- 调用一个空集合的方法 , 集合未被初始化

NO_DATA_FOUND                --- 下标索引指向一个被删除的元素,或是关联数组中不存在的元素

SUBSCRIPT_BEYOND_COUNT    --- 下标索引值超过集合中的元素个数

SUBSCRIPT_OUTSIDE_LIMIT --- 下标索引超过允许范围之外

VALUE_ERROR                  --- 下标索引值为空,或是不是指定的下标类型



5、关于数组的特有批量绑定ForAll

1、语法结构:


FORALL i IN pnums.FIRST .. pnums.LAST

INSERT INTO partno VALUES (pnums(i));   ---注意:不用再Loop了



2、可使用%BULK_ROWCOUNT属性来计算FORALL语句所影响到的行数


IF SQL % BULK_ROWCOUNT ( 3 ) = 0 THEN ...


表示如果第3次操作没有对数据影响的行数为0话……
注意%BULK_ROWCOUNT的值是可以大于1的,比如批量插入等


3、使用%BULK_EXCEPTIONS属性来控制FORALL异常


DECLARE

  TYPE numlist IS TABLE OF NUMBER ;

 

  num_tab      numlist  := numlist( 10 , 0 , 11 , 12 , 30 , 0 , 20 , 199 , 2 , 0 , 9 , 1 );

  ERRORS        NUMBER ;

  dml_errors   EXCEPTION ;

  PRAGMA EXCEPTION_INIT (dml_errors, - 24381 );

BEGIN

  FORALL i IN num_tab.FIRST .. num_tab.LAST SAVE EXCEPTIONS

    DELETE FROM emp

          WHERE sal > 500000 / num_tab(i);

EXCEPTION

  WHEN dml_errors THEN

    ERRORS     := SQL %BULK_EXCEPTIONS.COUNT;

    DBMS_OUTPUT.put_line( 'Number of errors is ' || ERRORS );

 

    FOR i IN 1 .. ERRORS LOOP

      DBMS_OUTPUT.put_line(   'Error '

                           || i

                           || ' occurred during '

                           || 'iteration '

                           || SQL % BULK_EXCEPTIONS (i).ERROR_INDEX);

      DBMS_OUTPUT.put_line(   'Oracle error is '

                           || SQLERRM (- SQL % BULK_EXCEPTIONS (i).ERROR_CODE));

    END LOOP ;

END ;

转载自:http://www.blogjava.net/decode360/category/40027.html
分享到:
评论

相关推荐

    pl/sql最新中文手册

    6. **复合类型**:PL/SQL支持数组、集合和记录等复合类型,这些使得处理复杂数据结构变得可能。手册会详细介绍这些类型的创建和使用。 7. **包(Packages)**:包是将相关的过程、函数和变量封装在一起的一种方式,...

    整理:oracle pl/sql 入门+ 数组使用+游标+动态SQL

    - PL/SQL数组:在PL/SQL中,数组是一种可以存储同一类型数据的集合,提供了批量操作数据的能力。 - 定义数组:学习如何声明并初始化数组,以及指定数组的大小和元素类型。 - 数组操作:包括赋值、索引访问、遍历...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    5. **集合类型**:包括数组(PLS_INTEGER索引的PL/SQL表)和关联数组(索引由非数字类型的值定义),以及如何在集合中插入、删除和迭代元素。 6. **包(PACKAGE)**:创建和使用包来组织相关的过程和函数,实现模块...

    pl/sql 学习资料

    - 数组:声明和操作PL/SQL索引数组和关联数组。 - 表类型:使用PL/SQL表类型进行集合操作。 -记录类型:定义和使用记录类型,类似于结构或对象。 5. **程序单元**: - 包(PACKAGE):定义公共接口和私有实现,...

    oracle 中 pl/sql 只是学习方法

    3. **集合和游标**:集合是PL/SQL中处理多行数据的有效工具,如VARRAYs(固定大小数组)和associative arrays(关联数组)。游标则允许我们一行一行地处理查询结果,是处理动态数据的重要手段。 4. **存储过程和...

    精通pl/sql

    5. **集合类型**:讨论PL/SQL中的集合类型,如数组、关联数组、表类型和索引表,以及它们在处理大量数据时的优势。 6. **包(PACKAGE)**:解释如何创建和使用包,包括包规范(PACKAGE SPECIFICATION)和包体...

    Oracle PL/SQL编程及最佳实践

    PL/SQL 也提供了复合类型,例如数组、记录等。这些类型可以由用户自定义,用于存储复杂的数据结构。 十二、批量绑定 批量绑定是 PL/SQL 中的一种机制,允许用户将多个值绑定到一个变量上。批量绑定可以提高程序的...

    pl/sql使用软件

    4. **集合**:PL/SQL支持数组和记录等集合类型,允许存储多个同类型的数据项。 5. **游标**:游标是处理查询结果集的一种方式,可以逐行访问SELECT语句返回的结果。这对于迭代处理大量数据非常有用。 6. **存储...

    oracle pl/sql fundamentals

    Oracle PL/SQL Fundamentals是Oracle University为学生设计的一份培训指南,旨在深入理解并掌握Oracle数据库中的PL/SQL编程基础。PL/SQL是Oracle数据库特有的结构化查询语言扩展,它结合了SQL的强大功能与过程性编程...

    PL/SQL学习笔记

    关联数组是一种允许以任意字符串作为索引的数组,常用于将PL/SQL表与程序中的数组结构相对应。关联数组的操作包括遍历、添加元素、修改元素和删除元素等。 异常处理是PL/SQL的一个重要特性。PL/SQL定义了多种类型的...

    Oracle PL/SQL best practice

    - 集合是PL/SQL中类似数组的数据结构,包括关联数组、索引表等,能高效处理多值数据。 - 使用集合进行批量操作,可以显著提高数据处理速度和代码简洁度。 4. 高性能PL/SQL: - 使用游标FOR循环代替显式循环,以...

    最容易上手的PL/SQL学习教程-有经过测试的丰富案例

    在§2.4中,我们学习了PL/SQL的变量类型,包括基本类型(如NUMBER、VARCHAR2等)、复合类型(如记录类型、数组类型)、%ROWTYPE(用于创建与表列结构对应的变量)以及LOB(Large Object)类型,后者用于存储大量非...

    PLSQLcode in Oracle9i PL/SQL Programming

    3. **PL/SQL变量和数组**:理解变量的声明、初始化、赋值和传递机制,以及如何使用PL/SQL数组来处理集合数据。 4. **游标**:在PL/SQL中,游标用于检索单行记录,它是处理查询结果集的一种方法。学习如何声明、打开...

    ORALCE PL/SQL程序设计第五版

    4. **集合和记录类型**:PL/SQL支持集合类型,如数组和关联数组,以及自定义记录类型,这些允许你存储和操作多条数据。集合和记录类型大大增强了处理复杂数据结构的能力。 5. **索引和触发器**:在Oracle数据库中,...

    PL/SQL语言的简介

    PL/SQL,全称为Procedural Language/Structured Query Language,是Oracle数据库的一种扩展,它集成了SQL查询语言和过程性编程元素,使得开发者能够编写复杂的数据库应用程序。在本篇文章中,我们将深入探讨PL/SQL的...

    Oracle PL/SQL by Example(4th Edition)

    《Oracle PL/SQL by Example(4th Edition)》是一本专为Oracle数据库用户设计的PL/SQL编程指南,尤其适合那些希望通过实践学习这一强大的过程式语言的开发者。本书的第四版详细介绍了Oracle PL/SQL的各种核心概念和...

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

    在Oracle数据库的PL/SQL环境中,联合数组(Varying Array)是一种特殊的变量类型,它允许程序员存储一组相同类型的元素,这些元素可以是数值、字符串或其他复杂的数据类型。联合数组在PL/SQL中扮演着重要角色,特别...

    pl/sql开发

    Oracle PL/SQL 开发是数据库开发中的重要技能,它是一种结合了SQL与过程性编程语言的集成环境,专为Oracle数据库设计。通过学习PL/SQL,开发者能够编写复杂的存储过程、函数、触发器等,以实现高效的数据处理和业务...

    PL/SQL存储过程编程

    ### PL/SQL存储过程编程详解 #### 一、Oracle应用编辑方法概览 在Oracle数据库的应用开发中,存在多种编辑方法和技术,它们各有特点和适用场景。以下是对这些方法的概述: 1. **Pro*C/C++**: 这是一种C语言与...

Global site tag (gtag.js) - Google Analytics