【发布时间】:2016-06-09 11:28:08
【问题描述】:
我正在尝试从对象表类型的变量中删除一个项目:
CREATE OR REPLACE TYPE "T_ATTRIBUTEPAGE_ATTRIBUTELIST" IS TABLE OF o_ATTRIBUTEPAGE_ATTRIBUTELIST;
CREATE OR REPLACE TYPE "O_ATTRIBUTEPAGE_ATTRIBUTELIST" IS OBJECT (
WizAttrEditID NUMBER,
InternalIndex NUMBER,
DimensionObjectID NUMBER,
AttributeName VARCHAR2(50),
AttributeLabel VARCHAR2(50),
AttributeType NUMBER,
AttributeLength VARCHAR2(50),
MandatoryAttribute NUMBER,
ReadOnly NUMBER,
Name VARCHAR2(2000),
Num NUMBER,
IsModified NUMBER,
Colour NUMBER);
我正在遍历对象列表,我检查了ls_attr_list.COUNT 是 16,我尝试在满足条件时删除一个项目,但我收到此错误:
ORA-01403:未找到数据
在这一行提出:ls_attr_list.Delete(i);
FOR i IN 1..ls_attr_list.COUNT LOOP
BEGIN
IF ls_attr_list(i).attributename = 'PROTECTION_ROLE' THEN
ls_attr_list.Delete(i);
END IF;
EXCEPTION WHEN OTHERS THEN
writelog(SQLERRM,'ERROR');
END;
END LOOP;
ls_attr_list 使用输入参数初始化:
PROCEDURE AttribInit(geninfo IN OUT o_geninfo,
pageinfo IN OUT o_attributepage_pageinfo,
attributelist IN OUT t_attributepage_attributelist,
enumlist IN OUT t_attributepage_enumlist)
AS
ls_attr_list := attributelist;
删除一项后迭代列表时出现问题
i := attributelist.FIRST;
LOOP
IF attributelist(i).attributename = 'PROTECTION_ROLE' THEN attributelist.DELETE(i);
END IF;
EXIT WHEN i = attributelist.LAST;
i := attributelist.NEXT(i);
END LOOP;
--second FOR
FOR i in 1..attributelist.COUNT LOOP
--到达上一个删除项的索引时没有找到数据
writelog(attributelist(i).attributename,'attributename');
END LOOP;
我做错了什么,有什么想法吗??
【问题讨论】:
-
当您从集合中间删除值时,您可能需要使用
FIRST/LAST/NEXT而不是使用FOR循环,因为COUNT < LAST。 -
不知道为什么,但是当我第一次看到无数据错误并且不知何故它不起作用时,我尝试了这个解决方案,但也许是匆忙我犯了一个错误,现在似乎工作了,但我找到了一个我现在正在使用的函数,它将列表和要查找的值作为参数并返回位置然后我从列表中删除该项目,谢谢