我收到错误下标超出限制。我如何解决它?

Posted

技术标签:

【中文标题】我收到错误下标超出限制。我如何解决它?【英文标题】:I am getting the error Subscript outside of limit. How do I fix it? 【发布时间】:2021-06-22 21:06:34 【问题描述】:

我知道是empName(COUNTER) := ENAME; 的代码行,但我似乎无法弄清楚问题所在。

SET SERVEROUTPUT ON;

DECLARE
    TYPE nameList IS VARRAY (10) OF VARCHAR2(10);
    empName nameList := nameList();
    ENAME    VARCHAR2(10);
    SAL      NUMBER(7,2);
    COUNTER  NUMBER := 0;

    CURSOR C1 IS
        SELECT ENAME, SAL
        FROM EMP
        WHERE ROWNUM < 11;        
BEGIN
    FOR person IN C1
    LOOP
        ENAME := person.ENAME;
        SAL := person.SAL;
        empName(COUNTER) := ENAME;
        COUNTER := COUNTER + 1;
    END LOOP;
END;
/

【问题讨论】:

【参考方案1】:

两个错误:

varray 索引从 1 开始,而不是 0(第 6 行) 你忘了扩展它(第 14 行)
SQL>   DECLARE
  2      TYPE nameList IS VARRAY (20) OF VARCHAR2(10);
  3      empName nameList := nameList();
  4      ENAME    VARCHAR2(10);
  5      SAL      NUMBER(7,2);
  6      COUNTER  NUMBER := 1;             --> not 0 but 1
  7      CURSOR   C1 IS SELECT ENAME, SAL
  8               FROM EMP
  9               WHERE ROWNUM < 11;
 10
 11    BEGIN
 12          FOR person IN C1
 13          LOOP
 14             empName.extend;             --> you're missing this
 15             ENAME := person.ENAME;
 16             SAL := person.SAL;
 17             empName(COUNTER) := ENAME;
 18             COUNTER := COUNTER + 1;
 19          END LOOP;
 20    END;
 21    /

PL/SQL procedure successfully completed.

SQL>

【讨论】:

我假设 extend 使 varray 更大。那是错的吗?很好奇,所以我了解它是如何实现的。 是的,extend 使 varray 更大。它开始是空的。 VARRAY(20) 表示限制为 20 个元素。我建议使用功能更多且没有限制的普通嵌套表集合类型。

以上是关于我收到错误下标超出限制。我如何解决它?的主要内容,如果未能解决你的问题,请参考以下文章

我收到“字符串下标超出范围错误”。我不知道为啥

我不断得到下标超出范围不知道如何解决它[关闭]

从数组插入数据时如何解决Oracle下标超出计数错误?

如何在路径中获取最后一个文件夹时解决运行时错误9,下标超出范围

在Swift中使用Google Calendar API时收到错误“超出未经身份验证的每日限制”

如何在“React(设置状态)”中解决“超出最大更新深度”