在Pl/SQL中使用数组时出现下标超出限制错误

在Pl/SQL中使用数组时出现下标超出限制错误,sql,oracle,Sql,Oracle,下面的程序访问PL/SQL中的数组,但是当我执行该过程时,它会给我一个下标超出限制的错误。为什么会发生这种情况?我看这个程序没有什么问题 CREATE OR REPLACE PROCEDURE ANALYSIS IS CURSOR EMPLOYEES IS SELECT * FROM EMPLOYEE; CURSOR BILLS IS SELECT * FROM BILL; WORKER EMPLOYEE%ROWTYPE; CASH BILL%ROWTYPE; TYPE SALARY IS

下面的程序访问PL/SQL中的数组,但是当我执行该过程时,它会给我一个下标超出限制的错误。为什么会发生这种情况?我看这个程序没有什么问题

CREATE OR REPLACE PROCEDURE ANALYSIS
IS
CURSOR EMPLOYEES IS
 SELECT * FROM EMPLOYEE;
CURSOR BILLS IS
 SELECT * FROM BILL;
WORKER EMPLOYEE%ROWTYPE;
CASH BILL%ROWTYPE;
TYPE SALARY IS VARRAY(4) OF NUMBER(5);
SALARIES SALARY;

BEGIN
 SALARIES:=SALARY(1,1,1,1);
 SALARIES.EXTEND(4);
 OPEN EMPLOYEES;
 OPEN BILLS;
 LOOP
  FETCH EMPLOYEES INTO WORKER;
  EXIT WHEN EMPLOYEES%NOTFOUND;
  IF WORKER.BRANCHID=1 THEN 
   SALARIES(1):=SALARIES(1)+WORKER.SALARY;
  ELSIF WORKER.BRANCHID=2 THEN 
   SALARIES(2):=SALARIES(2)+WORKER.SALARY;
  ELSIF WORKER.BRANCHID=3 THEN 
   SALARIES(3):=SALARIES(3)+WORKER.SALARY;
  ELSIF WORKER.BRANCHID=4 THEN 
   SALARIES(4):=SALARIES(4)+WORKER.SALARY;
  END IF;
 END LOOP;
END;

您已经创建了最多可以包含4个元素的数组:

TYPE SALARY IS VARRAY(4) OF NUMBER(5);
SALARIES:=SALARY(1,1,1,1);
SALARIES.EXTEND(4);
然后,您已经填充了4个元素:

TYPE SALARY IS VARRAY(4) OF NUMBER(5);
SALARIES:=SALARY(1,1,1,1);
SALARIES.EXTEND(4);
然后您尝试将其扩展为另外4个元素,即8个元素:

TYPE SALARY IS VARRAY(4) OF NUMBER(5);
SALARIES:=SALARY(1,1,1,1);
SALARIES.EXTEND(4);
这就是您得到错误的原因:

SQL> DECLARE
  2  TYPE SALARY IS VARRAY(4) OF NUMBER(5);
  3  SALARIES SALARY;
  4  BEGIN
  5   SALARIES:=SALARY(1,1,1,1);
  6   SALARIES.EXTEND(4);
  7  END;
  8  /
DECLARE
*
ERROR at line 1:
ORA-06532: Subscript outside of limit
ORA-06512: at line 6
你不需要延长线

注意:还有几点:

  • 既然你将数组值初始化为1,那么你的总数将比实际值高1
  • 为什么不选择BRANCHID,SUM(SALARY),而不是在循环中手动相加

  • 您已经创建了最多可以包含4个元素的数组:

    TYPE SALARY IS VARRAY(4) OF NUMBER(5);
    
    SALARIES:=SALARY(1,1,1,1);
    
    SALARIES.EXTEND(4);
    
    然后,您已经填充了4个元素:

    TYPE SALARY IS VARRAY(4) OF NUMBER(5);
    
    SALARIES:=SALARY(1,1,1,1);
    
    SALARIES.EXTEND(4);
    
    然后您尝试将其扩展为另外4个元素,即8个元素:

    TYPE SALARY IS VARRAY(4) OF NUMBER(5);
    
    SALARIES:=SALARY(1,1,1,1);
    
    SALARIES.EXTEND(4);
    
    这就是您得到错误的原因:

    SQL> DECLARE
      2  TYPE SALARY IS VARRAY(4) OF NUMBER(5);
      3  SALARIES SALARY;
      4  BEGIN
      5   SALARIES:=SALARY(1,1,1,1);
      6   SALARIES.EXTEND(4);
      7  END;
      8  /
    DECLARE
    *
    ERROR at line 1:
    ORA-06532: Subscript outside of limit
    ORA-06512: at line 6
    
    你不需要延长线

    注意:还有几点:

  • 既然你将数组值初始化为1,那么你的总数将比实际值高1
  • 为什么不选择BRANCHID,SUM(SALARY),而不是在循环中手动相加

  • 您已经创建了最多可以包含4个元素的数组:

    TYPE SALARY IS VARRAY(4) OF NUMBER(5);
    
    SALARIES:=SALARY(1,1,1,1);
    
    SALARIES.EXTEND(4);
    
    然后,您已经填充了4个元素:

    TYPE SALARY IS VARRAY(4) OF NUMBER(5);
    
    SALARIES:=SALARY(1,1,1,1);
    
    SALARIES.EXTEND(4);
    
    然后您尝试将其扩展为另外4个元素,即8个元素:

    TYPE SALARY IS VARRAY(4) OF NUMBER(5);
    
    SALARIES:=SALARY(1,1,1,1);
    
    SALARIES.EXTEND(4);
    
    这就是您得到错误的原因:

    SQL> DECLARE
      2  TYPE SALARY IS VARRAY(4) OF NUMBER(5);
      3  SALARIES SALARY;
      4  BEGIN
      5   SALARIES:=SALARY(1,1,1,1);
      6   SALARIES.EXTEND(4);
      7  END;
      8  /
    DECLARE
    *
    ERROR at line 1:
    ORA-06532: Subscript outside of limit
    ORA-06512: at line 6
    
    你不需要延长线

    注意:还有几点:

  • 既然你将数组值初始化为1,那么你的总数将比实际值高1
  • 为什么不选择BRANCHID,SUM(SALARY),而不是在循环中手动相加

  • 您已经创建了最多可以包含4个元素的数组:

    TYPE SALARY IS VARRAY(4) OF NUMBER(5);
    
    SALARIES:=SALARY(1,1,1,1);
    
    SALARIES.EXTEND(4);
    
    然后,您已经填充了4个元素:

    TYPE SALARY IS VARRAY(4) OF NUMBER(5);
    
    SALARIES:=SALARY(1,1,1,1);
    
    SALARIES.EXTEND(4);
    
    然后您尝试将其扩展为另外4个元素,即8个元素:

    TYPE SALARY IS VARRAY(4) OF NUMBER(5);
    
    SALARIES:=SALARY(1,1,1,1);
    
    SALARIES.EXTEND(4);
    
    这就是您得到错误的原因:

    SQL> DECLARE
      2  TYPE SALARY IS VARRAY(4) OF NUMBER(5);
      3  SALARIES SALARY;
      4  BEGIN
      5   SALARIES:=SALARY(1,1,1,1);
      6   SALARIES.EXTEND(4);
      7  END;
      8  /
    DECLARE
    *
    ERROR at line 1:
    ORA-06532: Subscript outside of limit
    ORA-06512: at line 6
    
    你不需要延长线

    注意:还有几点:

  • 既然你将数组值初始化为1,那么你的总数将比实际值高1
  • 为什么不选择BRANCHID,SUM(SALARY),而不是在循环中手动相加

  • 哦,好的!我刚刚尝试了一些东西,当我增加数组中的元素数时,错误消失了哦,好吧!我刚刚尝试了一些东西,当我增加数组中的元素数时,错误消失了哦,好吧!我刚刚尝试了一些东西,当我增加数组中的元素数时,错误消失了哦,好吧!我刚刚尝试了一些东西,我突然意识到,当我增加数组中的元素数时,错误消失了,这与你的问题没有直接关系,但是当一个
    SELECT。。分组方式
    就足够了吗?我打算进一步处理。我是sql的新手:P我不明白如何使用
    SELECT。。分组依据
    选择branchid,按branchid从员工分组中选择SUM(薪资)作为薪资
    与您的问题没有直接关系,但在选择单个
    时,为什么要使用循环。。分组方式
    就足够了吗?我打算进一步处理。我是sql的新手:P我不明白如何使用
    SELECT。。分组依据
    选择branchid,按branchid从员工分组中选择SUM(薪资)作为薪资
    与您的问题没有直接关系,但在选择单个
    时,为什么要使用循环。。分组方式
    就足够了吗?我打算进一步处理。我是sql的新手:P我不明白如何使用
    SELECT。。分组依据
    选择branchid,按branchid从员工分组中选择SUM(薪资)作为薪资
    与您的问题没有直接关系,但在选择单个
    时,为什么要使用循环。。分组方式
    就足够了吗?我打算进一步处理。我是sql的新手:P我不明白如何使用
    SELECT。。分组依据
    选择branchid,按branchid从员工组中选择总和(薪资)作为薪资