PL/SQL中集合出现“ORA-06533:下表超出数量”的问题解决
VARRAY是在Oracle8G的时候引入的一个类型,是一种密集填充数组,更容易被理解成为一个传统的数组。在创建这些数组的时候,都有一个尺寸,需要非常注意的是VARRAY的下表是从1开始的,在其他很多变成语言中,数组的下表都是从0开始的,比如JAVA。在实际的使用中,初学者经常会出现如下的错误提示:
ORA-06533:下表超出数量
www.2cto.com
例如下面的代码就会出现该错误:
[sql]
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 "Collection Constructors".)
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.
Example 5-20 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 inExample 5-6.
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
---
上面的大意是:
www.2cto.com
EXTEND方法为VARRAY或者NESTED TABLE集合中的一个或者多个新元素分配存储空间。有两个可以选择的选项,默认情况下,是它在向集合添加值之前的时候,为该值分配存储空间。他的两个参数的意思分别是,第一个参数是增加多少个元素的空间,第二个参数的意思是引用集合中已经存在的元素的索引,该元素就会被复制到新的元素上。
上面出错的代码修改为如下可以正常运行了:
[sql]
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;
相关推荐
在PL/SQL中当赋给变量的值不符合预期或超出范围时触发此异常。 **解决方法:** - 检查赋值操作是否正确。 - 使用适当的错误处理逻辑来捕获并处理此类异常。 #### 14. LOGIN_DENIED (ORA-01017) **异常描述:** 当...
* ORA-00034: 无法在当前 PL/SQL 会话中 二、资源错误 * ORA-00050: 获取入队时操作系统出错 * ORA-00051: 等待资源超时 * ORA-00052: 超出最大入队资源数 * ORA-00053: 超出最大入队数 * ORA-00054: 资源正忙,...
ORA-00034:无法在当前 PL/SQL 会话中 进程管理错误 ORA-00018:超出最大会话数 ORA-00019:超出最大会话许可数 ORA-00020:超出最大进程数 ORA-00021:会话附属于其它某些进程;无法转换会话 ORA-00072:进程号...
#### ORA-00034: 无法在当前PL/SQL会话中 当在当前PL/SQL环境中执行特定操作受限时触发。 #### ORA-00035: LICENSE_MAX_USERS不能小于当前用户数 当尝试降低 `LICENSE_MAX_USERS` 参数值,且新值小于当前活动用户的...
然而,在使用Oracle进行SQL操作时,可能会遇到各种错误代码,这些错误通常提供了关于问题的详细信息,帮助数据库管理员和开发人员识别并解决问题。以下是一些常见的Oracle错误代码及其含义: 1. ORA-00001: 这个...
- **描述**: 在PL/SQL环境中执行某些操作时出现错误。 - **解决方法**: 检查PL/SQL代码中的错误,并确保所有必要的资源都可用。 **ORA-00035: LICENSE_MAX_USERS不能小于当前用户数** - **描述**: 尝试降低`LICENSE...
- 描述:PL/SQL内部出现问题。 - 举例:通常表示编程错误,如逻辑错误或设计缺陷。 12. **ROWTYPE_MISMATCH (ORA-06504)** - 描述:主机游标变量与PL/SQL游标变量之间的返回类型不兼容。 - 举例:当两个游标...
了解这些错误代码的含义及解决方法,对于快速定位问题、解决问题有着至关重要的作用。以下是一些常见的Oracle错误代码及其解释: #### ORA-00001: 违反唯一约束条件 当尝试插入或更新的记录违反了数据库表中的唯一...
- **描述**:尝试在PL/SQL环境中执行特定操作时出现问题。 - **解决方案**:确认操作在当前环境下是否支持。 - **ORA-00035:LICENSE_MAX_USERS不能小于当前用户数** - **描述**:当尝试设置`LICENSE_MAX_USERS`...
##### orA-00034: 无法在当前PL/SQL会话中 - **描述**:在当前会话中执行了不允许的操作。 - **解决方法**:确保操作适用于当前会话类型。 ##### orA-00035: LICENSE_MAX_USERS不能小于当前用户数 - **描述**:...
#### ORA-00034: 无法在当前PL/SQL会话中 **描述**: 无法在当前的PL/SQL环境中执行特定操作。 **解决方法**: - 检查PL/SQL环境的配置。 - 确认操作是否适用于当前环境。 #### ORA-00035: LICENSE_MAX_USERS不能...
#### ORA-00034:无法在当前PL/SQL会话中 通常发生在尝试执行不允许在当前PL/SQL环境中运行的操作时。检查操作的适用环境。 #### ORA-00035:LICENSE_MAX_USERS不能小于当前用户数 当尝试降低`LICENSE_MAX_USERS`...
当在PL/SQL环境中尝试执行不允许的操作时,会出现此错误。检查是否在适当环境中执行操作。 #### ORA-00035: LICENSE_MAX_USERS不能小于当前用户数 如果尝试减少`LICENSE_MAX_USERS`参数的值,使其低于当前数据库中...
11. `Subscript_beyond_count` (ora-06533):对嵌套表或 varray 的下标超出范围。 12. `Subscript_outside_limit` (ora-06532):对嵌套表或 varray 的下标低于最小值。 13. `Value_error` (ora-06502):赋值操作时,...
16. **SUBSCRIPT_BEYOND_COUNT** (ORA-06533): 当尝试访问嵌套表或VARRAY元素的下标超出其范围时,会触发此异常。确保下标在有效范围内。 17. **SUBSCRIPT_OUTSIDE_LIMIT** (ORA-06532): 当使用嵌套表或VARRAY元素...
- **异常描述**:通常表示PL/SQL内部问题,需重装数据字典视图和PL/SQL包解决。 - **错误代码**:ORA-06501 - **场景示例**:当PL/SQL引擎检测到内部错误,可能是由于系统配置不当或软件缺陷引起,此时需检查并修复...
有效的异常处理机制不仅可以帮助开发者更好地控制程序流程,还能够在出现问题时提供更详尽的错误信息,从而快速定位并解决问题。 #### 二、异常处理分类 根据ORACLE提供的异常处理机制,我们可以将异常分为三类: ...