ORA 06533:下标超出计数

时间:2015-03-09 15:07:33

标签: oracle plsql

我创建了以下简单的块但是获得了

  

ORA 06533:超出计数的下标

错误。

有人可以告诉我下面代码中缺少的内容。

declare
  type salaryvarray is varray(6) of customers.salary%type;
  salary_array salaryvarray:=salaryvarray();
  c_salary customers.salary%type;
  i integer(2);
  counter number(2);
begin
  salary_array.extend;
  select count(*) into counter from customers;
  for i in 1..counter loop
    select salary into c_salary from customers where id =i;
    salary_array(i):=c_salary;
  end loop;
end;
/

4 个答案:

答案 0 :(得分:7)

代码的array_var.extend部分需要在循环内部。每次添加时,都会分配新内存。跳过这一步是要求代码存储一些东西而不给它空间。

declare
  type salaryvarray is varray(6) of customers.salary%type;
  salary_array salaryvarray:=salaryvarray();
  c_salary customers.salary%type;
  i integer(2);
  counter number(2);
begin
  select count(*) into counter from customers;
  for i in 1..counter loop
    salary_array.extend; -- Extend for each value.
    select salary into c_salary from customers where id =i;
    salary_array(i):=c_salary;
  end loop;
end;
/

但很快就会遇到类似的错误ORA-06532: Subscript outside of limit。您将VARRAY限制为6个元素,但客户可能会有更多元素。考虑限制返回,扩展VARRAY或实现更动态的集合类型。

答案 1 :(得分:2)

您的select count(*) into counter from customers;以超过6种结果无法保存到varray(6)变量中。

您可以使用nested tableassociative array来代替具有固定数量元素的数组。

来源:Declare dynamic array in PLSQL

答案 2 :(得分:1)

您的salary_array最多可以获得6个客户的工资,但您的select count(*) into counter from customers会返回超过6个记录。

由于这个原因,数组无法保存数据或换句话说,限制下标大于varray的数量。

答案 3 :(得分:1)

salary_array.extend仅扩展1个索​​引。 您必须使用以下语法来扩展varray的所有索引:

salary_array.extend(6);

对于其他情况,将varray的大小设置为6。