视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PL/SQL中集合出现“ORA-06533:下表超出数量”的问题解决
2020-11-09 10:52:23 责编:小采
文档


VARRAY是在Oracle8G的时候引入的一个类型,是一种密集填充数组,更容易被理解成为一个传统的数组。在创建这些数组的时候,都有一

VARRAY是在Oracle8G的时候引入的一个类型,是一种密集填充数组,,更容易被理解成为一个传统的数组。在创建这些数组的时候,都有一个尺寸,需要非常注意的是VARRAY的下表是从1开始的,在其他很多变成语言中,数组的下表都是从0开始的,比如JAVA。在实际的使用中,初学者经常会出现如下的错误提示:

ORA-06533:下表超出数量

例如下面的代码就会出现该错误:

DECLARE
TYPE NUM_VARRAY IS VARRAY(100) OF NUMBER NOT NULL;
V_NUM_VARRAY NUM_VARRAY:=NUM_VARRAY();
BEGIN
FOR J IN 1 .. 100 LOOP
V_NUM_VARRAY(J) := J;
END LOOP;
FOR I IN 1 .. V_NUM_VARRAY.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_NUM_VARRAY(I)));
END LOOP;
END;

这个错误的原因是什么呢?我们定义了一个为空的VARRAY,在第一个J循环的时候,将1赋值给V_NUM_ARRAY(1),但是因为实际上,该集合变量并没有存储空间,因此PL/SQL就会报一个“下表超出数量”的错误。

如何去解决这个问题呢?查阅Oracle 的MOS 找到了如下描述:

EXTEND Collection Method

EXTEND is a procedure that adds elements to the end of a varray or nested table. The collection can be empty, but not null. (To make a collection empty or add elements to a null collection, use a constructor. For more information, see .)

The EXTEND method has these forms:

  • EXTEND appends one null element to the collection.

  • EXTEND(n) appends n null elements to the collection.

  • EXTEND(n,i) appends n copies of the ith element to the collection.

    Note:

    EXTEND(n,i) is the only form that you can use for a collection whose elements have the NOT NULL constraint.

  • EXTEND operates on the internal size of a collection. That is, if DELETE deletes an element but keeps a placeholder for it, then EXTEND considers the element to exist.

    declares a nested table variable, initializing it with three elements; appends two copies of the first element; deletes the fifth (last) element; and then appends one null element. Because EXTEND considers the deleted fifth element to exist, the appended null element is the sixth element. The procedureprint_nt prints the nested table variable after initialization and after the EXTEND and DELETE operations. The type nt_type and procedure print_nt are defined in.

    Example 5-20 EXTEND Method with Nested Table

    DECLARE nt nt_type := nt_type(11, 22, 33); BEGIN print_nt(nt); nt.EXTEND(2,1); -- Append two copies of first element print_nt(nt); nt.DELETE(5); -- Delete fifth element print_nt(nt); nt.EXTEND; -- Append one null element print_nt(nt); END; /

    Result:

    nt.(1) = 11 nt.(2) = 22 nt.(3) = 33 --- nt.(1) = 11 nt.(2) = 22 nt.(3) = 33 nt.(4) = 11 nt.(5) = 11 --- nt.(1) = 11 nt.(2) = 22 nt.(3) = 33 nt.(4) = 11 --- nt.(1) = 11 nt.(2) = 22 nt.(3) = 33 nt.(4) = 11 nt.(6) = NULL ---

    上面的大意是:

    EXTEND方法为VARRAY或者NESTED TABLE集合中的一个或者多个新元素分配存储空间。有两个可以选择的选项,默认情况下,是它在向集合添加值之前的时候,为该值分配存储空间。他的两个参数的意思分别是,第一个参数是增加多少个元素的空间,第二个参数的意思是引用集合中已经存在的元素的索引,该元素就会被复制到新的元素上。

    上面出错的代码修改为如下可以正常运行了:

    DECLARE
    TYPE NUM_VARRAY IS VARRAY(100) OF NUMBER NOT NULL;
    V_NUM_VARRAY NUM_VARRAY:=NUM_VARRAY();
    BEGIN
    FOR J IN 1 .. 100 LOOP
    V_NUM_VARRAY.EXTEND;
    V_NUM_VARRAY(J) := J;
    END LOOP;
    FOR I IN 1 .. V_NUM_VARRAY.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_NUM_VARRAY(I)));
    END LOOP;
    END;

    下载本文
    显示全文
    专题