我创建了以下简单的块但是获得了
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;
/
答案 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 table或associative array来代替具有固定数量元素的数组。
答案 2 :(得分:1)
您的salary_array
最多可以获得6个客户的工资,但您的select count(*) into counter from customers
会返回超过6个记录。
由于这个原因,数组无法保存数据或换句话说,限制下标大于varray的数量。
答案 3 :(得分:1)
salary_array.extend(6);
对于其他情况,将varray的大小设置为6。